閱讀759 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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



最後更新:2017-04-03 05:38:54

  上一篇:go 匯編語言測試:到底是加快還是乘快?
  下一篇:go C標準中關於空指針的那些事