在C中是否可以提高srand(time(NULL))的刷新速度?
我想知道是否有办法提高在C中是否可以提高srand(time(NULL))的刷新速度?,c,srand,C,Srand,我想知道是否有办法提高srand(time(NULL))的速度函数“刷新”?我知道srand()会根据时间产生一个新的种子(因此每秒一次),但我正在寻找一种替代srand()的方法,它可以以超过1秒的间隔刷新 当我运行我的程序时,它会产生它应该产生的结果,但种子基本上保持不变一秒钟,因此如果程序每秒运行多次,结果保持不变 很抱歉问了这么一个简单的问题,但我无法在anywhere online上找到专门针对C的答案不是一个函数,而是两个函数:time()返回自历元以来的当前时间(以秒为单位);以及
srand(time(NULL))的速度代码>函数“刷新”?我知道srand()
会根据时间产生一个新的种子(因此每秒一次),但我正在寻找一种替代srand()
的方法,它可以以超过1秒的间隔刷新
当我运行我的程序时,它会产生它应该产生的结果,但种子基本上保持不变一秒钟,因此如果程序每秒运行多次,结果保持不变
很抱歉问了这么一个简单的问题,但我无法在anywhere online上找到专门针对C的答案
不是一个函数,而是两个函数:time()
返回自历元以来的当前时间(以秒为单位);以及初始化随机数生成器种子的srand()
。您正在将rendom number生成器的种子初始化为以秒为单位的当前时间,这是一件非常合理的事情
然而,您有一些误解,您实际上只需要运行srand
一次,或者最多每隔几分钟运行一次,之后rand()
将继续自行生成更多随机数,srand()
只是为rand设置一个初始种子
第二,如果你真的想这样做,虽然我不明白为什么你会这样做,你可以使用一个函数,返回时间到一个更高的精度。为此,我建议
gettimeofday()
。您可以尝试从其他源获取种子值。例如,在unix系统上,您可以从/dev/random获取一个随机的四字节值:
void randomize() {
uint32_t seed=0;
FILE *devrnd = fopen("/dev/random","r");
fread(&seed, 4, 1, devrnd);
fclose(devrnd);
srand(seed);
}
在Windows下,您可以使用
GetTickCount()
而不是time()
。它每隔50毫秒改变一次(如果记得正确的话)。我也遇到了同样的问题,我找到了一个简单的解决方法
#包括
#包括
int main(){
long long t1=std::chrono::高分辨率时钟::now();
标准::srand((无符号int)t1);
}
如果需要大于秒的精度,请使用从gettimeofday()
派生的值,而不是time()
。这与srand
完全正交。适当的功能选择将取决于操作系统。此外:如果您担心随机数的质量,请从获取随机数据(使用证书身份验证以防止MotM攻击)因此,如果程序每秒运行多次
——与您的第二段相矛盾。我相信OP并不是在代码本身中多次调用srand()
,程序正在运行多次。@SouravGhosh我是说这样做是错误的方法,用户应该让程序每次运行更长时间,而只是运行rand()来获得更多的随机数。让我澄清一下,我并没有说你错了,只是说不要提出像这样的更改,用户应该让程序每次运行的时间更长。这真的取决于程序的性质,不是吗?@SouravGhosh确实如此,但事实上rand()不应该用于任何东西,除了玩具程序。我假设用户只是想学习一些基本的C语言,并且对程序的工作方式有一定的灵活性。。我认为如果使用得当,rand()
是可靠的。我很感兴趣。你能给我指出一些链接吗?我可以从中了解到在实际程序中使用rand()
的缺点。另外,你不想使用add,你想使用bitwise或。可能值得注意的是,这依赖于某种类似UNIX的操作系统。