1

シードを使用せずに C で乱数を生成する方法はありますか。

これまでのところ、まだ srand(time(NULL)); を使用しています。これは種です。

#include <stdio.h>
#include <time.h>
#include <math.h> /* required for sqrt() */
#include <stdlib.h> /* required for rand() */

int gen_rand();   /* note these are declarations of functions */

void main()
{
   int number;
   srand (time(NULL)); /* everytime you run program, it will give you different result */

   number = gen_rand();

   printf("%d is the power of 2 of %.0lf\n", number, sqrt(number));
}

/* Function generates random number power 2 of 20 - 230 */
int gen_rand()
{
   int n;
   n = rand() % 211;  /* n is random number in range of 0 - 210 */
   n = n + 20; /* n is now in range of 20 - 230 */
   return(n*n); /* return n to the power of 2 */
}
4

4 に答える 4

2

はいといいえ。基本的に、c でリモートの乱数を取得する方法は 2 つあります。

1) シード付きの疑似乱数ジェネレーターがあります。これは、巧妙な算術演算子と、混合、順列、ねじれなどの可能性のある多くの内部変数を使用して、いくつかのシーケンスを生成するアルゴリズムです。シードは暗黙的に指定できます (つまり、常にゼロで、プログラムを実行するたびに同じシーケンスが生成されます)。または、シードを実行間で何らかの方法で変更できる場合は、明示的にすることもできます。

2)実行間で何らかの形で変化する外部データ ソースを使用する。これは、timer、環境変数 (おそらくプログラム ID)、カメラからのノイズ、マウスの動きなどから生じる可能性があります。

1+2) 外部ノイズ源をシードとして疑似乱数ジェネレーターに使用します。

于 2012-10-15T08:28:38.477 に答える
1

すべての非ハードウェアベースの PRNG は、決定論的な性質に対抗するために何らかの形式のランダム入力を必要とするため、シードが常に必要になります。

Linuxで悪用を試すことができます/dev/rand(ただし、PRNGでもあります)。または、非常に最新のIntel CPUを使用している場合は、新しいデジタルRNG機能が機能します。

于 2012-10-15T08:25:25.333 に答える
0

いいえ。自動番号ジェネレーターをシードしない場合、決定論的に動作し、毎回同じ数値が生成されます。

于 2012-10-15T08:26:06.453 に答える
0

はい。ただし、シードを使用せずに関数を使用して乱数を生成rand()すると、同じ乱数のセットが得られます。

于 2012-10-15T11:15:21.523 に答える