这是我第一次使用C尝试随机数(我想念C#)。这是我的代码:
int i, j = 0;
for(i = 0; i <= 10; i++) {
j = rand();
printf("j = %d\n", j);
}
有了这段代码,我每次运行代码都会得到相同的顺序。但是如果我srand(/*somevalue/*)
在for
循环之前添加,它将生成不同的随机序列。谁能解释为什么?
您必须播种。随时间播种是个好主意:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ()
{
srand ( time(NULL) );
printf ("Random Number: %d\n", rand() %100);
return 0;
}
您会得到相同的序列,因为rand()
如果不调用,则会自动以1的值作为种子srand()
。
由于评论
rand()
将返回0到RAND_MAX
(在标准库中定义)之间的数字。使用模运算符(%
)给出除法的余数rand() / 100
。这将强制随机数在0-99范围内。例如,要获取0-999范围内的随机数,我们将应用rand() % 1000
。
我已经知道这一点,但是我的问题是,当我不使用srand时为什么会给出相同的顺序?
因为如果您不手动为其设置种子,则默认情况下始终将其设置为1。请参阅Aditya的答案。
如果需要考虑安全性,那么给时间撒上种子是个坏主意,因为攻击者通常可以相对轻松地(在几十到几百次尝试之间)找到或猜测启动时间,然后重播伪随机数序列。如果可能,请尝试使用操作系统提供的熵源作为种子。
如果需要考虑安全性,那么无论您如何使用rand()都不是一个好主意。除了PRNG算法的强度未知外,它通常只需要32位种子,因此即使您不随时间推移播种而使它变得格外容易,蛮力逼迫也是合理的。为安全起见,为rand()播种熵就像是给驴类固醇并将其输入[肯塔基州]德比赛车。
“例如,要获取0-999范围内的随机数,我们将应用rand()%1000”,请注意,除非将1000均匀地划分为RAND_MAX + 1(否则可能不会RAND_MAX通常为(2 ^ n)-1),并且还有很多其他问题。见azillionmonkeys.com/qed/random.html