今天跟大家分享的技巧是关于随机函数的。我们在编写程序时通常会用到随机数函数,今天我们就来分享一下随机函数的原理。当然这里的随机还不是真正意义上的随机,它的算法也是有迹可循的。先睹为快来看看它的实现原理:
unsigned int rand_seed = 0;
int rand()
{
rand_seed = rand_seed * 1103515245 + 12345;
return (unsigned int) (rand_seed / 65536) % 32768;
}
地这是Linux下随机函数的实现。我们可以看到它是通过四则运算来对一个数做处理,然后将这个结果保存起来,做为下一次随机数生成的基准数。我们来看一下用它生成20个随机数的结果:
0 8 8 17 18 7 5 1 2 10 1 12 19 18 7 15 8 13 12 1
表面上看没有什么问题,我们再运行一次看看结果:
0 8 8 17 18 7 5 1 2 10 1 12 19 18 7 15 8 13 12 1
事实上无论你运行多少次,结果都是一样的,这是为什么呢?因为rand_seed这个变量的初始值为0,所以每次运行rand()函数时它的运行结果都是一样的。如何来解决这一问题呢?我们可以编写另外一个函数,用于初始化这个rand_seed变量的初始值,也就是说我们要用一个不确定的数做为它的值,也就是通常人们据说的“随机种子”:
void srand(unsigned int seed)
{
rand_seed = seed;
}
通常我们都会用时间做为随机函数的种子,以为了让它产生随机数。
srand(time(0));
我们再来将程序运行多次看看它的结果:
4 1 8 17 14 0 16 18 18 14 14 2 16 16 17 15 0 0 18 18
19 10 17 9 8 10 14 3 0 4 10 14 18 19 11 5 15 1 6 15
8 19 8 14 19 13 5 7 9 17 6 12 7 4 7 10 5 2 16 5
17 8 0 11 9 19 7 11 13 10 10 10 8 8 16 7 8 11 18 6
效果还是很不错的,但它仍然只是一个伪随机函数。
今天的小技巧你学会了吗?
Copyright © 2015-2023 问渠网 辽ICP备15013245号