C ++ srand seed没有生成正确的数字

时间:2015-05-14 21:47:08

标签: c++

对于我正在处理的程序,我们有一个充当骰子的函数,生成1到6之间的随机数。出于调试目的,我们应该使用的种子是srand(333),应该给我们相同的卷。这个种子的前25卷应该是:

5 4 4 3 3 4 5 2 3 6 5 2 4 1 5 5 3 3 6 4 4 3 4 2 6

然而,这肯定没有发生,我已经确认前三卷是5,5和4.整个程序应该模拟一场猪的游戏,但我觉得这个问题必须来自这两个功能中的一个,而不是主要功能。

int genRandInt (int minroll, int maxroll) {
    int randnum = minroll + (rand() % (maxroll - minroll + 1));
    return randnum;
}

int singleTurn (int holdnum) {
    int diceroll = genRandInt(1,6);
    int score = 0;

    while (score < holdnum) {
        if (diceroll == 1) {
            score = 0;
            return score;
        }
        else {
            score = score + diceroll;
        }
    }
    return score;
}

如果主要功能也是必要的,我可以发布。

2 个答案:

答案 0 :(得分:1)

发生过以下几件事之一:

  • 制作列表的人假设您将使用某个C ++标准库实现+版本,并且您应该使用相同的编译器/实现+版本,但您不是。您的代码很好,但您需要与制作该列表的人员交谈。
  • 前25卷只是一个样本,你的可能/会有所不同。你的代码很好。
  • 您在不同时间使用rand:经常或太少。如果是这样,这是您的代码中的错误。

答案 1 :(得分:0)

您发布了一个singleTurn方法,该方法将holdNum作为参数。 singleTurn方法的结果取决于您选择的holdNum。

你还没告诉我们你如何选择holdNum,所以我认为这就是问题所在。

但它可能不存在。

可能是RNG本身。

看,在我的机器上,我编写了以下程序:

#include <iostream>
#include <cstdlib>

int genRandInt (int minroll, int maxroll) {
    int randnum = minroll + (rand() % (maxroll - minroll + 1));
    return randnum;
}

int main()
{
    srand(333);
    for (int i = 0; i < 25; i++) {
        std::cout << " " << genRandInt(1,6);
    }

    return 0;
}

输出:

4 3 5 5 4 1 4 3 6 5 6 6 1 2 5 2 3 2 6 3 3 4 6 1

这与你拥有的和你正在寻找的不同。

问题的一部分是srand是一个黑盒子。它可以是32位或16位。此外,线性全等生成器的不同实现可以使用不同的数字来做出答案。

在幕后,基本算法是:

new_rand = mult * old_rand + add % mod

如果正确选择了mult和add(根据Hull-Dobell定理),你可以得到一个最多2 ^ mod的循环。

所以一些优秀的生成器所做的是存储数字是无符号的32或64位整数,并在它们溢出时自动回绕,这节省了昂贵的模运算,并为您提供最长的时间。

你真的不知道rand()正在做什么,但我保证它比random()或你自己写的64位RNG更糟糕。