簡體   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