C 関数のほとんどの実装では、 LGCrand()
のバリエーションを使用します。 、コンピューター化されたランダムジェネレーターが真のランダムではないように、それは疑似ランダムにすぎません。を使用するとランダム性が向上しますが、完全にはなりません。それは、使用されるシードがどれほど多様でランダムであるかによって異なります。たとえば、 で同じ同一のシードを使用して n 回呼び出した場合、結果は同じになります。しかし、毎回呼び出す場合(および呼び出し間の経過時間が のティックの期間よりも長い場合) は、ランダム ジェネレーターが改善されます。rand()
srand()
srand()
rand()
srand()
srand(clock())
clock()
以下は単純なコード例で、両方clock()
とサポート関数NotRecentlyUsed() ( minとmaxの小さなサンプル用) が使用されています。
#include <ansi_c.h>
#define _UNIQUE_
int randomGenerator(int min, int max);
int NotUsedRecently (int number);
int main(void)
{
int i=0;
for(i=0;i<1000;i++)
{
printf("%d,\t", randomGenerator(0, 20));
if(i%20 == 0) printf("\n");
}
getchar();
return 0;
}
//////////////////////////////////////////////////////
//generates pseudo random numbers between min and max
//If it is desired to use this without a guarantee of uniqueness
//for a specified span of values, un-define _UNIQUE_
//
int randomGenerator(int min, int max)
{
int random, trying;
trying = 1;
while(trying)
{
srand(clock());
random = (rand()/32767.0)*(max+1);
((random >= min)
#ifdef _UNIQUE_
&& NotUsedRecently(random)
#endif
) ? (trying = 0) : (trying = 1);
}
return random;
}
//This function is used to guarantee that a span of n generated values
//will not be the same. To adjust the span, change the index in
//static int recent[n]; Note: it is required that n < (max-min)
//otherwise an infinite loop will occur
int NotUsedRecently (int number)
{
static int recent[20];//Use No greater value for index than max - min
int i,j;
int notUsed = 1;
for(i=0;i<(sizeof(recent)/sizeof(recent[0]));i++) (number != recent[i]) ? (notUsed==notUsed) : (notUsed=0, i=(sizeof(recent)/sizeof(recent[0])));
if(notUsed)
{
for(j=(sizeof(recent)/sizeof(recent[0]));j>1;j--)
{
recent[j-1] = recent[j-2];
}
recent[j-1] = number;
}
return notUsed;
}