1 c++ random time seed standard-library
每当我在C++中使用rand函数时:
#include<iostream>
#include<time.h>
#include<stdlib.h>
using namespace std;
int main(){
srand(time(0));
int n=(rand()%6)+1;
cout<<"The dice roll is "<<n<<"."<<endl;
}
Run Code Online (Sandbox Code Playgroud)
我收到有关第5行从time_t到int的转换的警告:
srand(time(0));
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱这个警告?
实际上,你应该使用带有srand()的unsigned int:
srand((unsigned) time(0));
Run Code Online (Sandbox Code Playgroud)
另请注意,此代码:
rand()%6
Run Code Online (Sandbox Code Playgroud)
通常被认为是一种不良做法.rand()的低位比高位低得多.如果您这样做,您将获得更好的随机性:
(rand() >> 8)%6
Run Code Online (Sandbox Code Playgroud)
例如.
编辑:
有关这方面的更多详细信息,请参阅本说明以及Dobbs博士的这篇文章,该文章至少暗示了原因:
注意:请勿使用
Run Code Online (Sandbox Code Playgroud)y = rand() % M;因为这集中在rand()的低位.对于rand()经常使用的线性同余随机数生成器,较低字节比较高字节的随机性要小得多.事实上,最低位循环在0和1之间.因此rand()可以在偶数和奇数之间循环(试一试).注意rand()不必是线性同余随机数生成器.它是完全允许的更好的东西没有这个问题.
DDJ:
最重要的一点是,通常(线性同余)随机数发生器的输出的低位是最"随机"的.也就是说,较低位的模式是常见的.因此,在您的讨论中,常规滚动的输出并不令人惊讶.此外,依靠高位来确定返回的整数是可以避免的.
例如,如果要选择随机的"true"或"false"值,并使用了以下代码:
rand() % 2
Run Code Online (Sandbox Code Playgroud)
那么你最终可能会看到结果的模式:
1,0,1,0,1,0,1,0,1,0(等)
这显然不是随机的,但它是可能正在使用的线性同余生成器的属性.一个更好的方案(对于C++)可能是使用Boost.Random库,它支持各种可插拔随机生成器(包括没有这个缺陷的Mersenne Twister).
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |