平方取中法随机数函数

本文介绍了冯·诺伊曼提出的平方取中法,一种用于生成[0,1]均匀分布随机数的技术。通过16位种子的运算,简化实现并应用于游戏软件中。演示了C语言的代码示例,包括mm_srand和mm_rand函数,以及如何在游戏开发主函数中使用这些随机数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个做游戏软件的人,要做一个随机数函数用,抛出这样一个概念来。一群热爱做游戏的人,在那里讨论,…
  
  平方取中法(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值