gpt4 book ai didi

c++ - 为什么 rand()/double(RAND_MAX) 的第一个结果不是随机的

转载 作者:搜寻专家 更新时间:2023-10-31 00:16:02 25 4
gpt4 key购买 nike

这与这个问题有关 - random number generation in C++ ... first number not very random

#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;

int main()
{
srand((unsigned int)time(NULL));

cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;
cout << rand() / double(RAND_MAX) << endl;

return 0;
}

如果您一遍又一遍地运行二进制文件 (.exe),您会注意到第一个结果的前三个数字始终相同。例如。每次运行总是 0.54xxxxx。

不,这不是因为我发现了没有模式的地方。在每次运行之间等待几秒钟也无济于事。

编辑:只有第一个结果的前三个数字相同。其余的是“随机查找”。此外,生成器使用 srand() 作为种子(在上面代码示例的第一行)。

最佳答案

rand 的随机性未由标准指定。最多生成器将使用种子来初始化静态变量,并以一种应该的方式从中计算下一个值“出现”随机(但当然是完全确定的)。我的猜测是你机器上的实现返回静态变量的旧值,等于种子第一次通过。 (这让我很惊讶,通常返回静态的新值。)

无论如何,这是实现质量的问题。(我在 VC++11 中看到了同样的事情,但在 g++ 中却没有。)

编辑:

只是一个快速测试,看看不同的种子如何影响第一个返回的数字:

for ( int i = 1; i <= 10; ++ i ) {
std::srand( i );
std::cout << i << ": " << std::rand() << std::endl;
}

VC++11 的输出:

1: 41
2: 45
3: 48
4: 51
5: 54
6: 58
7: 61
8: 64
9: 68
10: 71

使用 g++ 4.7.2(CygWin 版本):

1: 1481765933
2: 816048218
3: 150330503
4: 1632096437
5: 966378722
6: 300661007
7: 1782426941
8: 1116709226
9: 450991511
10: 1932757444

你说你在代码块下用 g++ 看到了这个:我只能猜测 Code Blocks 设置了一些东西,以便 g++使用 Microsoft 库,而不是 GNU 库(通常是更好的解决方案)。

无论如何,解决方法很简单:替换你现在的单行用于为生成器播种:

std::srand( std::time( NULL ) );
std::rand(); // throw out first value...

如果您需要相对较好的随机数,请删除 std::rand完全支持一些定义更严格的C++11 中的生成器。 (如果你不是,你可以从 Boost 获得它们使用 C++11。)

关于c++ - 为什么 rand()/double(RAND_MAX) 的第一个结果不是随机的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com