随机数函数不能正确随机化(C ++)

时间:2014-01-14 22:11:18

标签: c++ random

所以我试图创建这个程序,从0到2随机生成一个10 x 10的随机整数矩阵。问题是程序总是给出相同的数字集。这是代码:

#include <iostream>
#include <stdlib.h>

using namespace std;

int mapDraw(int array[], int mapMax, int mapBound){
    for(int i = 0; i <= (mapMax - 1); i++){
        if((i % mapBound)==0){
            cout << endl;
        }
        cout << array[i];
    }
    return 0;
}

int main(){
    int mapx = 10;
    int mapz = mapx;
    int mapArea = mapx * mapz;
    int store[mapArea];
    for(int i = 0; i <= (mapArea -1); i++){
        int height = rand() % 3;
        store[i] = height;
    }
    mapDraw(store, mapArea, mapx);
    return 0;
}

当我运行代码时,它总是给我这个:

  

2211210012

     

2210121200

     

0020110222

     

2020012110

     

2020020121

     

2210012011

     

1220011211

     

2020120002

     

0201021221

     

0021212002

出于某种原因,它在多次运行程序后继续给我相同的输出。我希望得到一些帮助,我有预感,当你在你的机器上运行它会给你一个不同的矩阵所以请尝试多次运行它以查看连续运行的结果是否相同。感谢您的帮助!

4 个答案:

答案 0 :(得分:10)

使用针对程序的每个不同运行而更改的参数调用srand()(通常time(0)正常工作)。这将初始化伪随机数生成器的内部状态(正如您所注意到的,每当程序运行时,它都会设置为默认状态。)

答案 1 :(得分:6)

这不是一个错误,它是一个功能。

您需要这个才能重复调试。

一旦工作,你应该做的是传递种子值(例如以毫秒为单位的当前时间)。这将使其在运行中独一无二。

答案 2 :(得分:4)

您需要种子随机数生成器,否则它将始终生成相同的数字序列。执行此操作的界面是srand。当然,您需要一个随机数作为srand的输入。你必须得到那个地方。根据您较大的目标,time(0)可能已经足够好,或者可能完全不可接受(但可能rand本身也不够好)。告诉我们这是为了什么,我们可以给出更好的建议。

答案 3 :(得分:1)

您必须随机化随机数生成器的种子,您可以使用srand();例如,在调用rand()之前使用srand(time(NULL))。

随机数生成器有不同的算法。现在最常用的是Mersene捻线机。如果您是统一的随机数发生器,那么控制你是好的。构建蒙特卡罗模拟器以检查结果的再现。 您可以使用以下命令:

#include <random>
std::mt19937 m_Twister;
m_Twister(time(NULL));
std::uniform_real_distribution<double> distribution(0.0, 1.0);
//uniform random between [0,1]
double random = distribution(m_Twister);

另一个说法是Park Miller,现在它有点过时了。