初始化具有随机大小的std ::数组

Initialize std::array with a random size

本文关键字:std 数组 随机 初始化      更新时间:2023-10-16

我有两个宏:

#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;

但是我无法使用我的兰特功能初始化std ::数组:

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_t unsigned ints ststartants pointers 等。我总是收到此错误消息

错误msg我总是收到的: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数组在范围内随机长度?

no;阵列的长度必须是编译时间常数,并且std C 库中没有编译时间随机数引擎。

如果要确定数据连续缓冲区的运行时,请使用std::vector。它是用来的,以及它的作用。

如果您想要一个非std随机数编译时间常数,请选择4.我使用公平的模具将其滚动。

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

heck,您可以使C 程序将C 程序打印到文件中,在程序中包含C 编译器,链接到与您动态打印的程序的输出相对于您的程序。

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

无论哪种方式,除非有必要,否则您不应创建宏。有时它们是,但通常(包括在这些情况下(,它们会引起比解决的问题更多的问题,而您应该使用功能。您的lengthrandRange宏都可以更好地实现为功能,并且length已经存在为std::size

运行时随机数生成

如果您想要运行时随机数,那是人们在谈论随机性时通常想要的,则应使用C 随机性库,而不是rand函数。但是,除非您知道,否则很难使用。比大多数程序员想费心学习随机数的要多得多。我建议使用基于它易于使用的一些库,例如Randutils库。

编译时间随机数

如果出于某种原因,您要在编译时生成一个随机数,以便每次运行程序时都会获得相同的数字,但是如果重新编译,则会获得不同的数字,这在C 中是可能的11岁及以后。有一个有关此主题的C 每周视频,还有其他您可以在线找到的示例。