100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > rand函数生成伪随机数

rand函数生成伪随机数

时间:2020-11-20 01:08:00

相关推荐

rand函数生成伪随机数

调用rand()函数前需要调用srand函数

srand函数设置生成一系列伪随机整数的起点。

要重新初始化生成器,需要为srand提供一个随机种子参数。

种子的值都会将生成器设置为随机起点。

我们用时间戳来当作种子 -- srand((unsigned int)time(NULL))

rand检索生成的伪随机数。

通过结果显现现象(来对比一系列代码):

(1)

一旦通过随机种子(时间戳)设置好srand起点,将会通过rand生成一系列真正的伪随机数

注意这里通过随机种子设置srand起点的方式不是调用!!如果这里概念比较模糊,先跳过向后看,就可以理解了。

//真正的伪随机int main(){srand(time(NULL));while (1){int num1 = rand();int num2 = rand();printf("%d %d\n", num1, num2);}return 0;}

(2)

如果多次通过调用的方式设置srand起点,且每次设置时间小于1s,那么在这1s内, rand函数生成值相同,直到下一秒。 总结为:srand起点每1s重新设置一次

//错误示范1int main(){while (1){srand(time(NULL));int num1 = rand();int num2 = rand();printf("%d %d\n", num1, num2);}return 0;}

(3)

用固定值来作为种子来设置srand起点,rand生成的值永远不变。

错误示范2:int main(){while (1){srand(1);int num1 = rand();int num2 = rand();printf("%d %d\n", num1, num2);}return 0;}

(4)

以下是两次运行结果,不难看出,单次看似随机,实际每次运行rand生成值对应相等 其原因就是没有使用srand设置起点,默认起点为种子为1的srand起点。

错误示范3:int main(){while (1){int num1 = rand();int num2 = rand();printf("%d %d\n", num1, num2);}return 0;}

总结

水平有限,就用通俗一点的话来解释吧。

且暂时理解为:

1.

提供给srand的种子如果固定,rand永远不变。

2.

通过时间戳作为种子,在1s内多次通过调用设置srand起点,实际上srand每隔1s才能通过调用改变一次起点,

相当于在1s内没有更改种子值,导致1s内多次设置同一种子的起点,故结果与1相同,rand在1s内永不变

3.

通过时间戳作为种子,设置好srand起点后,在1s内不改变起点或者在1s后改变起点,rand生成值永远是随机值

4.

如果不提供srand起点,rand每次生成值虽然看似随机,但实际当多次运行程序时,发现每次运行后,生成值一一对应相等。

5.

通过时间戳作为种子,srand每次重新调用设置的起点间隔是1s!注意是重新调用!但是一旦设置好起点,每次生成srand起点间隔就是非常小,不知道确切的值但一定小于1s。

注意:最容易混淆的一个点就是!

是通过调用srand函数来设置srand起点,

还是通过srand函数自身种子参数的变化来设置起点。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。