【问题标题】:Random number function not properly randomizing (C++) [duplicate]随机数函数未正确随机化(C++)[重复]
【发布时间】:2014-01-15 06:37:38
【问题描述】:

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

#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

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

【问题讨论】:

  • 非常感谢你们的回答!使用 srand() 函数清除一切!

标签: c++ random


【解决方案1】:

调用srand(),参数会随着程序的每次不同运行而变化(通常time(0) 工作正常)。这将初始化伪随机数生成器的内部状态(如您所见,它在程序运行时设置为默认状态)。

【讨论】:

  • 我从来没有在这么短的时间内看到这么多的赞成票!
【解决方案2】:

这不是错误,而是一项功能。

您需要它是可重复的才能进行调试。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      随机数生成器有不同的算法。现在最常用的是梅森捻线机。如果您是例如,最好控制您的统一随机数生成器。建立一个蒙特卡洛模拟器来检查结果的再现。 您可以使用以下命令:

      #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,不过现在它有点过时了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-29
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 2019-10-17
        相关资源
        最近更新 更多