C语言中如何写一个简单可移植而又足够随机的随机数生成器
在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语言中如何写一个简单可移植而又足够随机的随机数生成器的更多相关文章
- 利用windows.h头文件写一个简单的C语言倒计时
今天写一个简单的倒计时函数 代码如下: #include<stdio.h> #include<windows.h> int main() { int i; printf(&qu ...
- 【阿菜做实践】利用go语言写一个简单的Pow样例
本篇博客的主要内容是用go写一个简单的Proof-of-Work共识机制,不涉及到网络通信环节,只是一个本地的简单demo.开发IDE用的是JB Golang. 整个项目的文件结构如下: PoWdem ...
- 如何写一个简单的http服务器
最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...
- 写一个简单的C词法分析器
写一个简单的C词法分析器 在写本文过程中,我参考了<词法分析器的实现>中的一些内容.这里我们主要讨论写一个C语言的词法分析器. 一.关键字 首先,C语言中关键字有: auto.break. ...
- 如何写一个简单的HTTP服务器(重做版)
最近几天用C++重新写了之前的HTTP服务器,对以前的代码进行改进.新的HTTP服务器采用Reactor模式,有多个线程并且每个线程有一个EventLoop,主程序将任务分发到每个线程,其中采用的是轮 ...
- 用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定, ...
- 用C写一个简单的推箱子游戏(一)
我现在在读大二,我们有一门课程叫<操作系统>,课程考查要求我们可以写一段程序或者写Windows.iOS.Mac的发展历程.后面我结合网上的资料参考,就想用自己之前简单学过的C写一关的推箱 ...
- 手把手教你从零写一个简单的 VUE--模板篇
教程目录1.手把手教你从零写一个简单的 VUE2.手把手教你从零写一个简单的 VUE--模板篇 Hello,我又回来了,上一次的文章教会了大家如何书写一个简单 VUE,里面实现了VUE 的数据驱动视图 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
随机推荐
- Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
请尊重分享成果,转载请注明出处: http://blog.csdn.net/hejjunlin/article/details/52349221 前言:从本篇开始,将进入Multimedia框架,包含 ...
- 仿qq最新侧滑菜单
为了后续对这个项目进行优化,比如透明度动画.背景图的位移动画,以及性能上的优化. 我把这个项目上传到github上面,请大家随时关注. github地址https://github.com/sungu ...
- javascript之事件处理
一般事件 onclick 鼠标点击时触发此事件 ondblclick 鼠标双击时触发此事件 onmousedown ...
- 详解EBS接口开发之销售订单挑库发放
1. 对销售订单的有效性验证 1)检查销售订单的行是否被完全传回客户化表 2)验证销售订单的关键字段 3)检查子库存是否启用了货位控制,如果启用了货位控制,没有生成货位, ...
- Qzone React Native改造
Android Qzone 6.1版本在情侣空间涉水React Native,以动态插件方式将情侣空间进行React Natived的改造.在情侣空间基础上,Android Qzone 6.2版本以融 ...
- FFmpeg API 变更记录
最近一两年内FFmpeg项目发展的速度很快,本来是一件好事.但是随之而来的问题就是其API(接口函数)一直在发生变动.这么一来基于旧一点版本的FFmpeg的程序的代码在最新的类库上可能就跑不通了. 例 ...
- SDL2源代码分析7:显示(SDL_RenderPresent())
===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...
- 03 RadioButton 单选按钮
>概念:从多个互斥选项中选择一个 如果是选项全部展开 RadioButton 不是展开的Spinner(下拉列表) >属性: android:checked="tr ...
- lua c函数注册器
lua与c的交互 关于lua和c的交互,主要有两个方面,一是lua调用c的函数,而另一个则是c调用lua函数.而这些都是通过lua stack来进行的. c调用lua 在c里面使用lua,主要是通过l ...
- Java进阶(七)Java加密技术之非对称加密算法RSA
Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...