繁体   English   中英

用随机大小初始化std :: array

[英]Initialize std::array with a random size

我有两个宏:

#define length(array) sizeof(array)/sizeof(array[0])
#define randRange(x,y) x + ( std::rand() % ( y - x + 1 ) )

我可以做这个:

int data[] = {2, 3, 34, 10, 3, 12, 30 };
const int arr_length = length(data);
std::array<int,arr_length> data_std_array;

我可以用一个常量初始化:

const int arr_length = 500;
std::array<int,arr_length> data_std_array;

但是我无法使用rand函数初始化std :: array:

float a = randRange(2, 200);
const int arr_length = (int)a;
std::array<int,arr_length> data_std_array;

float a = randRange(2, 200);
int counter = 0;
for(int i =0; i < a; i++){
    counter++;
}
const int arr_length = counter;
std::array<int,arr_length> data_std_array;

float a = randRange(2, 200);
const int arr_length = static_cast<int>(a);

这些都不起作用。

我尝试了各种变量,例如size_tunsigned ints常量指针等。我总是收到此错误消息

我总是收到的错误消息:float a = randRange(2,200); const int arr_length = static_cast(a);

/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp: In member function ‘virtual void algorithmTest_TestAlgorithmRandomArray_Test::TestBody()’:
/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp:87:20: error: the value of ‘arr_length’ is not usable in a constant expression
     std::array<int,arr_length> data_std_array;
                    ^
/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp:76:15: note: ‘arr_length’ was not initialized with a constant expression
     const int arr_length = static_cast<int>(a);
               ^
/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp:87:30: error: the value of ‘arr_length’ is not usable in a constant expression
     std::array<int,arr_length> data_std_array;
                              ^
/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp:76:15: note: ‘arr_length’ was not initialized with a constant expression
     const int arr_length = static_cast<int>(a);
               ^
/home/martin/Documents/github/on-line-mean-calculation/tests/test.cpp:87:30: note: in template argument for type ‘long unsigned int’ 
     std::array<int,arr_length> data_std_array;

我如何初始化和std数组具有范围内的随机长度?

没有; 数组的长度必须是一个编译时间常数,并且std C ++库中没有编译时间随机数引擎。

如果要由运行时确定的连续数据缓冲区,请使用std::vector 它是做什么的,它是做什么的。

如果你想有一个非std随机数编译时间常数,选择4. 我推出它使用骰子。

从理论上讲,您可以使用宏来对代码的编译时间进行编码,并根据该宏编写一个编译时间伪随机数生成器。 或者,您可以使用延续传递样式和模板化代码来绑定一定数量的K程序,然后选择要在运行时执行的程序。 但是所有这些都是坦率的坏主意。

哎呀,您可以使您的C ++程序将C ++程序打印到文件中,在程序中包含C ++编译器,链接到您动态打印的程序输出,然后运行该代码。

std::array具有编译时大小。 这意味着,无论您用它做什么,每次运行该程序时,它都会创建一个具有相同数量元素的数组。 如果这不是您想要的,则应查看std::vector ,它可以在运行时更改大小,因此每次运行程序时它都可以不同。

无论哪种方式,除非它们是必需的,否则都不应创建宏。 有时是这样,但通常(包括这些情况),它们引起的问题超出了解决的范围,您应该改用函数。 您的lengthrandRange宏都可以更好地实现为函数,并且length已作为std::size存在。

运行时随机数生成

如果您想要运行时随机数,这是人们在谈论随机性时通常需要的随机数,则应使用C ++随机性库 ,而不要使用从C继承rand函数 但是,除非您对大多数程序员不愿学习随机数有更多的了解,否则可能很难使用。 我建议使用一些基于它的易于使用的库 ,例如randutils库

编译时随机数生成

如果由于某种原因要在编译时生成一个随机数,以便每次运行该程序时都得到相同的数字,但是如果重新编译则得到一个不同的数字,则在C ++ 11和更高版本中是可能的。 一个有关该主题的C ++每周视频 ,以及您可以在线上找到的其他示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM