2

我制作的小游戏有问题。

#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
int span = 100;
srand(time(0));
int TheNumber = static_cast<double> (rand()) /RAND_MAX * (span -1) +1;
cout << "You need to guess the number between 1 and " << span << endl;
int mynumber;
int numberofAttempts = 0;

do {
    cout << ++numberofAttempts <<" Attempt: ";
    cin >> mynumber;
    if (mynumber > TheNumber)
        cout <<"Lower!" << endl;
    else if (mynumber < TheNumber)
        cout <<"Higher!" << endl;
} while (mynumber != TheNumber);

cout << "SUCESS!!!" << endl;
return 0;
}

游戏应该生成一个介于 0-100 之间的随机数,你应该猜到它。在运行此代码 15-20 次后,相同的数字甚至产生了 8 次(在我的情况下为 2)。

我知道没有绝对的随机数,它使用一些数学公式或其他东西来获得一个。我知道使用srand(time(0))使它依赖于当前时间。但是我如何让它“更”随机,因为我不希望发生我上面提到的事情。

我第一次运行它的结果是 11,再次运行后(猜对了数字之后),它仍然是 11,即使时间改变了。

4

3 回答 3

3

[补充1]

如果您确实希望研究更好的随机数生成,那么这是一个很好的算法:

http://en.wikipedia.org/wiki/Mersenne_twister

请记住,任何“计算机生成”(即数学生成)随机数都只是伪随机数。伪随机意味着虽然算法的输出看起来具有正态分布,但如果知道输入种子,它们是真正确定的。真正的随机数是完全不确定的。

[ORIGINAL] 只需尝试以下行之一:

rand() % (span + 1);  // This will give 0 - 100
rand() % span;        // this will give 0 - 99
rand() % span + 1;    // This will give 1 - 100

代替:

(rand()) /RAND_MAX * (span -1) +1

另外,不要将结果转换为双精度,然后放入 int。

也看这里:

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

回应评论!!!如果您使用:

rand() / (span + 1);

那么为了获得 0 到 100 之间的值,rand 的输出值确实必须在 0 到 (100 * 100) 之间,并且必须保证这种性质。这是因为简单的划分。当 rand() 产生 101 - 201 时,值 1 将基本上弹出,当 rand() 输出 202 - 302 的值时,2 将从除法中弹出,等等......

在这种情况下,您可能能够在 100 * 100 仅 10000 处侥幸逃脱,并且在 32 位空间中肯定有比这更大的整数,但通常进行除法不会让您利用提供完整的数字空间!

于 2012-06-28T14:15:33.193 回答
2

有很多问题rand()。您遇到了其中一个,即前几个值不是“随机的”。如果必须使用rand(),最好丢弃前四个或结果rand()

srand (time(0));
rand();
rand();
rand();
rand();

另一个问题rand()是,众所周知,低位是非随机的,即使在上述破解之后也是如此。在某些系统上,最低位交替 0,1,0,1,0,1,... 使用高位总是更好,例如使用商而不是余数。

其他问题:非随机性(大多数实现都rand()没有通过随机性测试)和短周期。对于所有这些问题,最好的建议是使用除rand().

于 2012-06-28T14:38:10.240 回答
1

首先,rand() / RAND_MAX不给出 0 和 1 之间的数字,它返回 0。这是因为 RAND_MAX 在 rand() 的结果中适合 0 次。两者都是整数,因此整数除法不会返回浮点数。

其次,RAND_MAX 可能与 INT 大小相同。将 RAND_MAX 乘以任何东西都会产生溢出。

于 2012-06-28T14:11:38.920 回答