一个做游戏软件的人,要做一个随机数函数用,抛出这样一个概念来。一群热爱做游戏的人,在那里讨论,…
平方取中法(midsquare method)是产生[0,1]均匀分布随机数的方法之一,亦称冯·诺伊曼取中法,最早由冯·诺伊曼(John von Neumann,1903-1957)提出的一种产生均匀伪随机数的方法。此法将一个2s位十进制随机数平方后得到的一个4s位数,去头截尾取中间2s位数作为一个新的随机数,重复上述过程可得到一个伪随机数列。
平方取中法是冯·诺依曼提出的。此法开始取一个2s位的整数,称为种子,将其平方,得4s位整数(不足4s位时高位补0),然后取此4s位的中间2s位作为下一个种子数,并对此数规范化(即化成小于1的2s位的实数值),即为第一个(0,1)上的随机数。以此类推,即可得到一系列随机数。
这里给出取s=16比较实用,贴近当今计算机的特征和计算机语言变量类型的特征。用时间对随机函数进行初始化,可以真正达到随机函数的效果。
需要自己的随机函数的话,这个随机函数比较简单实用。
mm.h代码如下:
#define MM_S16 16
unsigned long long mm_val;
void mm_srand(unsigned);
unsigned mm_rand();
mm.c代码如下:
#include "mm.h"
void mm_srand(unsigned x)
{
mm_val = x;
}
unsigned mm_rand()
{
mm_val *= mm_val;
mm_val >>= MM_S16;
mm_val &= 0x00000000FFFFFFFFLL;
return mm_val;
}
测试主函数main.c代码如下:
/* B00017 平方取中随机数函数 */
#include <stdio.h>
#include <time.h>
#include "mm.h"
int main()
{
int i;
time_t t;
/* 初始化随机数发生器 */
mm_srand((unsigned) time(&t));
/* 输出 0 到 99 之间的 10 个随机数 */
for( i = 1 ; i <= 10 ; i++ )
printf("%d\n", mm_rand() % 100);
return 0;
}