C语言中如何写一个简单可移植而又足够随机的随机数生成器
2014-07-03 20:50
381 查看
在C语言中标准库中的随机数产生函数的返回可能不是最优的,因为有些随机数生成器的低位并不随机,而另一些返回随机数的函数实现上又太复杂鸟。所以rand()%N并不是一个好方法,牛人给出的建议是使用:
rand()/(RAND_MAX/N+1)
其中RAND_MAX在stdlib.h中定义,而假设N要远远小于RAND_MAX.而PARK和MIller提供的“最小标准”的可移植随机数生成器的C实现如下:
编译生成后,运行结果如下:
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
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语言中如何写一个简单可移植而又足够随机的随机数生成器
- C语言中如何写一个简单可移植而又足够随机的随机数生成器
- 如何使用epoll? 一个C语言的简单例子 - asdfjkl210 - ITeye技术网站
- 如何用C语言产生10000个不重复的随机整数?并且把它写入到一个文本文件中作为其他函数测试用的数据。
- C语言如何产生一个随机数,rand函数的使用
- Python(6) 实现一个简单的随机验证码生成器
- 如何使用纯win32函数和C语言实现一个简单的文本编辑器
- sql如何获取一个0-15之间的随机数(不包括0,15),而且必须带两位随机的小数
- 如何安装 pandom : 一个针对 Linux 的真随机数生成器
- C语言——产生一个随机字符或者随机数
- <C语言>如何一步一步根据简单的代码联想到更多的功能?(实现输入一个整数,输出比它小包括它本身的所有素数。)
- 一种基于归并排序及随机数生成器对一个给定数组进行随机排列的算法
- 如何使用epoll? 一个C语言的简单例子 - asdfjkl210 - ITeye技术网站
- C语言中如何产生一个随机数及其原理。
- C语言的一个简单算法: 26个字母随机步生成
- 如何设计一个高效算法从N个正整数中,随机选取n个不同的随机数 n<=N
- 足够随机的随机数应用举例
- 一个简单密码生成器
- 如何做一个密码“生成器”?
- 用C语言实现一个简单的HTTP客户端(HTTP Client)