C语言中如何写一个简单可移植而又足够随机的随机数生成器

时间:2023-02-21 16:54:19

在C语言中标准库中的随机数产生函数的返回可能不是最优的,因为有些随机数生成器的低位并不随机,而另一些返回随机数的函数实现上又太复杂鸟。所以rand()%N并不是一个好方法,牛人给出的建议是使用:

rand()/(RAND_MAX/N+1)

其中RAND_MAX在stdlib.h中定义,而假设N要远远小于RAND_MAX.而PARK和MIller提供的“最小标准”的可移植随机数生成器的C实现如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>

#define a 16807	//or 48271
#define m 2147483647
#define q (m/a)
#define r (m%a)

static long int seed = 1;
//return rand long in [1,m]
long int pm_rand(void)
{
	long hi = seed / q;
	long lo = seed % q;
	long tmp = a * lo - r * hi;
	if(tmp > 0)
		seed = tmp;
	else
		seed = tmp + m;
	return seed;
}

int main(void)
{
	for(int i = 0;i < 100;++i)
		printf("%ld    ",pm_rand());
	puts("");
	return 0;
}

编译生成后,运行结果如下:

apple@kissAir: c_src$gcc -std=c99 -Wall -O3 -g0 -o rnd rnd.c

apple@kissAir: c_src$./rnd

16807    282475249    1622650073    984943658    1144108930    470211272    101027544    1457850878    1458777923    2007237709    823564440    1115438165    1784484492    74243042    114807987    1137522503    1441282327    16531729    823378840    143542612 
  896544303    1474833169    1264817709    1998097157    1817129560    1131570933    197493099    1404280278    893351816    1505795335    1954899097    1636807826    563613512    101929267    1580723810    704877633    1358580979    1624379149    2128236579 
  784558821    530511967    2110010672    1551901393    1617819336    1399125485    156091745    1356425228    1899894091    585640194    937186357    1646035001    1025921153    510616708    590357944    771515668    357571490    1044788124    1927702196 
  1952509530    130060903    1942727722    1083454666    1108728549    685118024    2118797801    1060806853    571540977    194847408    2035308228    158374933    1075260298    824938981    595028635    1962408013    1137623865    997389814    2020739063 
  107554536    1635339425    1654001669    1777724115    269220094    34075629    1478446501    1864546517    1351934195    1581030105    1557810404    2146319451    1908194298    500782188    657821123    753799505    1102246882    1269406752    1816731566 
  884936716    1807130337    578354438    892053144

C语言中如何写一个简单可移植而又足够随机的随机数生成器的更多相关文章

  1. 利用windows&period;h头文件写一个简单的C语言倒计时

    今天写一个简单的倒计时函数 代码如下: #include<stdio.h> #include<windows.h> int main() { int i; printf(&qu ...

  2. 【阿菜做实践】利用go语言写一个简单的Pow样例

    本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...

  3. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

  4. 写一个简单的C词法分析器

    写一个简单的C词法分析器 在写本文过程中,我参考了<词法分析器的实现>中的一些内容.这里我们主要讨论写一个C语言的词法分析器. 一.关键字 首先,C语言中关键字有: auto.break. ...

  5. 如何写一个简单的HTTP服务器(重做版)

    最近几天用C++重新写了之前的HTTP服务器,对以前的代码进行改进.新的HTTP服务器采用Reactor模式,有多个线程并且每个线程有一个EventLoop,主程序将任务分发到每个线程,其中采用的是轮 ...

  6. 用node&period;js从零开始去写一个简单的爬虫

    如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...

  7. 用C写一个简单的推箱子游戏(一)

    我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...

  8. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  9. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

随机推荐

  1. s3c2440液晶屏驱动 (内核自带) linux-4&period;1&period;24

    自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev ...

  2. javascript 解析dom字符串

    知识要求:1:熟悉dom结构层次(如childNodes,nodeType,parent,children)等. 2:熟悉jq对象转换js 对象,反之 毕竟不是专业js人.借助第3方框架.其实jq也是 ...

  3. 【1】第一次电话面试---上海EMC

    时间是2016//11月,投的是上海的EMC2公司的JavaWeb开发岗,第一次接到的电话面试,问的题目很基础基础,很遗憾,本人在掌握的太不好,回答的很乱,目测定挂.下面记下HR问的问题及回答. 首先 ...

  4. Sharepoint数据库存储过程

    转:http://dugan.bokee.com/630497.html Databases Table Stored Procedures(数据库表存储过程) Globals Table Store ...

  5. 1&period;Introduction 介绍

    Welcome to Log4j 2! Introduction Almost every large application includes its own logging or tracing ...

  6. CentOS openssh升级至7&period;4版本

    1.原环境: cat /etc/issue CentOS release 6.5 (Final) ssh -V OpenSSH_7.3p1, OpenSSL 1.0.1e-fips 11 Feb 20 ...

  7. CTF---Web入门第十三题 拐弯抹角

    拐弯抹角分值:10 来源: cwk32 难度:易 参与人数:5765人 Get Flag:2089人 答题人数:2143人 解题通过率:97% 如何欺骗服务器,才能拿到Flag? 格式:CTF{} 解 ...

  8. &lbrack;C&num;&rsqb;设计模式-简单工厂-创建型模式

    在设计模式当中有三大工厂,分别是 简单工厂.抽象工厂.工厂方法 这三种创建实例的设计模式,这里先从简单工厂将其,从名字就可以看出这是这三种工厂模式当中最为简单的一种实现. 简单工厂一般由以下几个对象组 ...

  9. c&plus;&plus;随机排序容器中的元素

    在各种程序语言中都提供了将容器元素随机排序的shuffle方法,c++也不例外. 不过c++将shuffle放在了<algorithm>中而不是像其他语言一样在random里,同时c++1 ...

  10. atitit 读书与获取知识资料的attilax的总结&period;docx

    atitit 读书与获取知识资料的attilax的总结.docx 1.1. 读书即是获取知识,获取资料,获取信息的一种方式 2 2. 获取资料信息的目的,有什么作用,有什么用途?? 2 2.1. 扩大 ...