c++中的随机数组生成

random array generation in c++

本文关键字:数组 随机 c++      更新时间:2023-10-16

我想写一个简单的函数,生成一个随机整数数组。

我遇到了一个有趣的事情,当我运行这个程序输出-每一个计数语句-看起来是一样的。

然而,当我调试和观察它一步一步数组值正在改变。

我做错了什么吗?

谢谢。

void generateRandomArray( int *&inputArray, int size){
    if(inputArray != NULL){
        delete []inputArray;
    }
    //create a new array
    inputArray = new int [size];
    //fill with random numbers   
    srand(unsigned (time (NULL)));
    for (int i = 0; i < size ; i++)     
        inputArray[i] = (rand() % 100) ;
}
int main(){
    //Variables
    int *inputArray = NULL;
    int size;

    //Test
    size = 10;
    //first call
    generateRandomArray( inputArray, size);
    for(int i = 0 ; i < size; i++){
        cout << inputArray[i] << endl;
    }
    cout << "------------------" << endl;
    //second call
    generateRandomArray( inputArray, size);
    //output is the same with previous
    for(int i = 0 ; i < size; i++){
        cout << inputArray[i] << endl;
    }
    return 0;
}    

程序运行太快,srand(unsigned (time (NULL)));将获得具有相同秒数的种子(自epoch以来)。因此,rand序列是相同的。

问题是,如果对srand的调用都在同一秒内发生,则生成器将以相同的值播种,因此始终生成相同的序列。

当你调试时,它会变慢,允许时间流逝,并为生成器提供不同的种子。如果不调试,调用之间的时间间隔会太快。

不要调用srand超过一次,除非你知道你在做什么。把它放在main函数的开头,不要再调用

调用srand(time(NULL)),它将获取当前时间并从中生成随机数。

时间总是在变化的,所以每次给你的数字都不一样。

对于c++ 11,您可以使用如下命令:(https://ideone.com/EIb0nY)

#include <iostream>
#include <random>
#include <vector>
std::vector<int> generateRandomArray(std::default_random_engine& generator, int size)
{
    std::uniform_int_distribution<int> distribution(1, 100);
    std::vector<int> res(size);
    for (auto& e : res) {
        e = distribution(generator);
    }
    return res;
}
int main()
{
    std::default_random_engine generator;
    const int size = 10;
    //first call
    for (auto e : generateRandomArray(generator, size)) {
        std::cout << e << std::endl;
    }
    std::cout << "------------------" << std::endl;
    //second call
    for (auto e : generateRandomArray(generator2, size)) {
        std::cout << e << std::endl;
    }
    return 0;
}

使用新的随机设施。
它避免手动内存管理(使用std::vector)。