编程小技巧

    返回首页    发表留言
本文作者:李德强
          技巧八:随机函数原理
 
 

        今天跟大家分享的技巧是关于随机函数的。我们在编写程序时通常会用到随机数函数,今天我们就来分享一下随机函数的原理。当然这里的随机还不是真正意义上的随机,它的算法也是有迹可循的。先睹为快来看看它的实现原理:

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号