乱数発生器

1324 ワード

多くの人はrand()%nで区間[0,n]内のランダム整数を生成するのが好きだ.このようにして生成された整数が均一に分布するかどうかはともかく、nがRAND_より大きい場合MAXでは,この方法では所望の結果は得られない.RAND_MAXは32767ほど小さい可能性が高いので、この方法を使用するときは注意してください.
 
#include "stdio.h"
#include "stdlib.h" 
#include "time.h"
int n=100,m=1000;

double random()
{
	return (double)rand()/RAND_MAX;
}

//  [0,m-1]        
double random(int m)
{
	return (int)(random()*(m-1)+0.5);
}


int main()
{
	srand(time(NULL));	//         
	/*
                         ,   time.h    time(NULL)     srand。
                1970 1 1 0       "  " 。
       */
//	printf("RAND_MAX: %d
",RAND_MAX); printf("%d %d
",m,n); for(int i=0;i

 
上記のコードはRAND_で除算されていますMAXは,[0,1]間のランダム実数を得,n−1倍に拡大した後に四捨五入し,さらに1を加えて[1,n]間の均一な整数を得た.これはnが大きいと「精度」が悪い(画像を拡大した「鋸歯」のようだ)が、ここのnは小さいので、要求を満たすことができる.
プログラムは最初にsrand(time(NULL))を実行し、srand関数は「乱数シード」を初期化するために使用されます.簡単に言えば,種子は擬似乱数計算の根拠である.シードは同じで、計算された[乱数](Random)シーケンスは常に同じです.srandを呼び出さずにrand()を直接使用すると、srand(1)が1回呼び出されたことに相当するため、プログラムが実行されるたびに、同じ乱数が得られる.また、同じプログラムで乱数を生成するたびにsrandを再呼び出さないでください.ある初心者が「rand()で発生した乱数はまったくランダムではない」と愚痴をこぼしているのは、srand()の役割を誤解しているからです.もう一度強調して、同じプログラムで何度も呼び出さないで、プログラムの先頭で1回だけsrandを呼び出してください.