【问题标题】:random number generator c++随机数生成器 C++
【发布时间】:2013-11-29 21:42:02
【问题描述】:

好的,我对 C++ 很陌生,我正在尝试让随机数生成器工作。一般的想法是for循环每次调用随机生成器并将随机数放入数组中。它基本上可以工作,唯一的问题是数字不是随机的。每次它都会打印出 -842150451,这有点问题。

int main()
{
    int *array;
    int size;
    cout << "Enter size of array: ";
    cin >> size;
    array = new int[size];
    for (int x = 0; x < size; x++)
    {
        srand ( time(NULL) );
        int randomNumber;
        randomNumber = rand() % 10000 + 1;
        randomNumber >> array[x];

这是一个更大的排序算法的一部分,所以我不会费心复制整个事情,因为这是问题的一部分。

【问题讨论】:

  • 请阅读您正在使用的所有功能的手册。
  • 您显示的代码中的数字没有打印输出。这也可能存在问题,而不仅仅是 srand,因为这段代码在运行之间确实给出了不同的结果,即使每次运行中生成的数字是相同的,并且它们在预期的范围内。请展示一个显示问题的最小工作示例。
  • @fpw:不,main 的空参数列表很好。
  • 等等 -- randomNumber >> array[x]; 应该做什么?
  • 在此处插入每日 响应。

标签: c++ random


【解决方案1】:

在循环之前调用srand。它根据当前时间初始化生成器 - 如果您的循环足够快,您将在每次迭代中使用相同的种子对其进行初始化,因此没有真正的随机性。一次初始化就足够了。

@ThomasPadron-McCarthy 在您的问题的一个 cmets 中指出的另一个问题:您正在尝试使用将值放入数组中

randomNumber >> array[x];

如果你没有重载那个操作符,这是一个移位操作,它会改变随机数,但不会将它存储到数组中。使用它来存储它:

array[x] = randomNumber;

【讨论】:

  • 我想“每次”他的意思是“当我打印它时,在我阵列的每个地方”。
【解决方案2】:

如果可以,您应该使用 C++11 的 &lt;random&gt;。一点都不难,比srand()之类的有飞跃。

#include <random>

...

std::mt19937 rng_engine(seed);
std::uniform_int_distribution<int> dist(min, max);
array[x] = dist(rng_engine);

有点冗长,但您可以使用std::bind 简化最后一次调用:

auto newrand = std::bind(dist, rng_engine);
array[x] = newrand();

关于随机数引擎的说明:如果您在代码中的其他位置生成更多随机数,请尝试使用单个引擎对象(您可以创建多个分布,甚至针对不同的类型)。 std::mt19937 存储 624 个 32 位整数以保持状态;这大约是 2.5 KiB 的内存。

【讨论】:

    【解决方案3】:

    既然你使用 C++,为什么不使用 C++ 的方式呢?

    这是一些示例代码(您可以将其定制到您的应用中):

    #include <random>
    
    int main()
    {
        // A Mersenne Twister pseudo-random generator:
        typedef std::mt19937 CppRNG;
    
        // Seed the generator:
        uint32_t seed_val = 0;
        CppRNG RandomGenerator;
        RandomGenerator.seed(seed_val);
    
        int min = 1; // use your val
        int max = 50; // use your val
    
        std::uniform_int_distribution<uint32_t> uniformMinMax(min, max);
    
        int r1 = uniformMinMax(RandomGenerator);
        int r2 = uniformMinMax(RandomGenerator);
    
     //... and so on
    
    return 0;
    }
    

    【讨论】:

      【解决方案4】:

      您的代码中有几个问题。一个是在每次迭代中调用的 srand,如 fpw 所述。但是你认为这条线有什么作用呢?

      randomNumber >> array[x];
      

      如果您希望它将 randomNumber 复制到数组中的某个位置,那不是它的作用。相反,它会移动一些位,并丢弃结果。所以当你稍后打印数组的内容时,它们将是未初始化的垃圾。

      【讨论】:

        猜你喜欢
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-24
        • 1970-01-01
        • 2016-08-15
        • 2017-04-10
        • 1970-01-01
        相关资源
        最近更新 更多