C语言中如何写一个简单可移植而又足够随机的随机数生成器
来源:互联网 发布:旅行商问题算法回溯法 编辑:程序博客网 时间:2024/04/30 01:55
在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;elseseed = 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语言中如何写一个简单可移植而又足够随机的随机数生成器
- 随机数生成器C语言
- C语言中随机数的简单总结
- 足够随机的随机数应用举例
- 一个简单的随机色生成器
- 易语言如何写一个取随机数的程序
- C语言中的随机数生成器
- 自己写了一个小小的双色球号码随机生成器
- C语言如何产生一个随机数,rand函数的使用
- C语言——产生一个随机字符或者随机数
- 用C#生成足够随机的互不相同的随机数
- C语言中一些比较基础而又重要的知识
- 一个简单的C#双色球号码随机生成器
- 分享一个简单高效的C#随机函数生成器类
- 随机数生成器,随机种子
- c语言中,随机数的生成,随机ID的原理及利用
- 浅谈C语言中如何取随机数
- C语言/C++中如何产生随机数
- Java中 static的用法
- 线程中断
- 仪表盘设计师访谈录之二 -- FacileThings首席执行官Francisco Sáez
- struts2中验证码的生成和使用
- OPNET如何添加自己写的管道阶段函数?
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
- matlab中求解由符号表达式组成的非线性方程组
- android EMOJI
- 自定义布局RelativeLayout 画网格线
- jasig cas配置过程
- MSYS、MinGW、Cgywin
- app Widget 介绍及其例子一
- CSocket 和CAsyncSocket类介绍
- [LeetCode] Remove Duplicates from Sorted Array II