梅森旋转法产生随机数

2023-12-11 11:08

本文主要是介绍梅森旋转法产生随机数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接贴代码了:

#include <stdio.h>
#include <stdlib.h>typedef unsigned long uint32;#define N           (624)           // length of state vector
#define M           (397)
#define K           (0x9908B0DFU)   // a magic constant
#define hiBit(u)    ((u) & 0x80000000U) // mask highest bit of u
#define loBit(u)    ((u) & 0x00000001U) // mask lowest bit of u
#define loBits(u)   ((u) & 0x7FFFFFFFU) // mask all but highest bit of u
#define mixBits(u, v)  (hiBit(u) | loBits(v)) // move high bit of u to low bits of vvoid seedMT(uint32 seed);
uint32 reloadMT(void);
uint32 randomMT(void);static uint32   state[N+1];
static uint32   *next;
static int      left = -1;void seedMT(uint32 seed)
{register uint32 x = (seed | 1U) & 0xFFFFFFFFU, *s = state;register int    j;for(left = 0, *s++=x, j=N; --j;*s++ = (x*69069U) & 0xFFFFFFFFFF);
}uint32 reloadMT(void)
{register uint32 *p0=state, *p2=state+2, *pM=state+M, s0, s1;register int    j;if(left < -1)seedMT(4357U);left=N-1, next=state+1;for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++)*p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);for(pM=state, j=M; --j; s0=s1, s1=*p2++)*p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);s1 = state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U);s1 ^= (s1 >> 11);s1 ^= (s1 << 7) & 0x9D2C5680U;s1 ^= (s1 << 15) & 0xEFC60000U;return (s1 ^ (s1 >> 18));
}uint32 randomMT(void)
{uint32 y;//printf("... left = %d\n", left);if(--left < 0)return (reloadMT());//printf("... *next = %d\n", *next);y = *next++;y ^= (y >> 11);y ^= (y << 7) & 0x9D2C5680U;y ^= (y << 15) & 0xEFC60000U;y ^= (y >> 18);return (y);
}// test only
int main() {int seed;scanf("%d", &seed);seedMT(seed);int cnt = 1000000, a = 0, b = 0;while(cnt--) {if(randomMT()%2==0) {a++;}else b++;reloadMT();}printf("%d %d\n", a, b);return 0;
}

这篇关于梅森旋转法产生随机数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/480478

相关文章

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

明明的随机数处理问题分析与解决方案

明明的随机数处理问题分析与解决方案 引言问题描述解决方案数据结构设计具体步骤伪代码C语言实现详细解释读取输入去重操作排序操作输出结果复杂度分析 引言 明明生成了N个1到500之间的随机整数,我们需要对这些整数进行处理,删去重复的数字,然后进行排序并输出结果。本文将详细讲解如何通过算法、数据结构以及C语言来解决这个问题。我们将会使用数组和哈希表来实现去重操作,再利用排序算法对结果

Java生成随机数工具类,进制之间的转换工具类,获取指定时间,时间格式转换工具类

废话不多说,贡献一下code 1.编号生成工具 import org.apache.commons.lang3.StringUtils;import java.math.BigInteger;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Random;/*** 编号生成工具*/@

Cocos2dx 3.0 过渡篇(五) 随机数的获取

1、简单的随机数用法:CCRANDOM_0_1 示例如下: [cpp] int HelloWorld::getRand(int start,int end)  {   float i = CCRANDOM_0_1()*(end-start+1)+start;  //产生一个从start到end间的随机数   return (int)i;  }   2、上述的方法虽然简便,但是运行

(php伪随机数生成)[GWCTF 2019]枯燥的抽奖

审核源码发现加载check.php,审计发现使用了mt_rand()函数,这个函数生成的值是伪随机的 参考下面这篇文章 PHP mt_rand安全杂谈及应用场景详解 - FreeBuf网络安全行业门户 kali里面输入下载工具 git clone https://github.com/openwall/php_mt_seed.git cd进去输入make后编译出的文件先

V---机器视觉图像误判产生的因素

1.环境光 (1)图像传感器周围的光照产生的影响; (2)外接的强光产生的影响,造成图像的差异; 2.产品的个体差异 (1)产品批次变更; (2)测试时使用的样品和实际生产的产品的制作环境不同,实际生产产品有细微差异,造成干扰。 3.产品来料位置不同造成的差异 (1)假如产品移动到图像传感器视野的角落时,可能会产生形变,形变的差异造成误判。 (2)假如产品移动到图像传感器视野的不同

用鼠标拖动终端cmd 会产生ctrl-C中断,导致程序终止

电脑上用vnc或者mstsc登陆远程服务器,只要一用鼠标拖动终端的窗口,就会产生一个^C中断,就像按下了Ctrl-C一样,导致正在运行的程序终止。用鼠标选定内容后复制或者拖动滚动条也会出现同样的问题。 对此问题的解决方案是,将WIN上运行的各种词典关闭屏幕取词! 也有可能是系统上的某个软件影响到了远端的cmd上的运行,可以全部关闭测试。

平台用户一千万的情况有没有高并发产生?

问: 平台用户一千万的情况有没有高并发产生? 回答: 有的。在一个拥有一千万用户的平台上,即使并非所有用户都同时活跃,仍然可能在某些时段(如促销活动或热门事件)出现高并发情况。处理如此大规模用户的并发请求,需要强大的后端支持和高效的前端优化来确保平台稳定性和响应速度 问: 前端对这个情况该怎么做 回答: 前端在应对一千万用户的高并发情况时,可以采取以下措施: 内容优化:减少页面加

STM32G474之随机数发生器

STM32G474一个RNG设备,它能提供由“集成模拟电路”生成的32位随机数,是硬件随机数发生器。在C语言中,若包含头文件“stdlib.h”,我们就可以使用有rand()函数,它是C语言中用于生成随机数的函数。 1、“随机数”的应用 1)、一般用“随机数”作为延时函数的传递参数,来获取不同的延时时间。在多主机通讯系统中,要求时间同步采集数据,但是数据传输,若发生在同一时刻,通讯就会发生碰撞

DuplicateKeyException产生原因及解决方案

DuplicateKeyException 是 Spring 框架中与数据库操作相关的异常之一,通常在试图向数据库中插入一条记录时,违反了唯一性约束(如主键或唯一索引约束)时抛出。这意味着数据库中已经存在具有相同键值的记录,导致插入操作失败。 一、产生原因 主键冲突: 原因: 在数据库表中,每个记录的主键(Primary Key)必须唯一。当尝试插入一条记录,其主键值与现有记录的主键值相同时