如何用rand()摆脱警告?(C++)

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)

有没有办法摆脱这个警告?

Yuv*_*dam 8

实际上,你应该使用带有srand()unsigned int:

srand((unsigned) time(0));
Run Code Online (Sandbox Code Playgroud)

  • 迂腐的注意事项 - 使用static_cast配方进行演员表演更加友好. (5认同)

sho*_*osh 6

另请注意,此代码:

rand()%6
Run Code Online (Sandbox Code Playgroud)

通常被认为是一种不良做法.rand()的低位比高位低得多.如果您这样做,您将获得更好的随机性:

(rand() >> 8)%6
Run Code Online (Sandbox Code Playgroud)

例如.

编辑:

有关这方面的更多详细信息,请参阅本说明以及Dobbs博士的这篇文章,该文章至少暗示了原因:

注意:请勿使用

  y = rand()  %  M;
Run Code Online (Sandbox Code Playgroud)

因为这集中在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).

  • 可以详细说明(我对C++很新) (3认同)