0

これは私のコードです:

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <crypt.h>
#include <string.h>
#include <stdlib.h>

int main(void){

int i;
unsigned long seed[2];

/* Generate a (not very) random seed */
seed[0] = time(NULL);
seed[1] = getpid() ^ (seed[0] >> 14 & 0x30000);

printf("Seed 0: %lu ; Seed 1: %lu", seed[0], seed[1]);
return 0;
}

ハッシュ関数に使用される非常にランダムなシードを生成したいのですが、その方法がわかりません!

4

3 に答える 3

3

Mersenne Twisterに行きます。これは非常に高速で、非常に長い期間と非常に優れた分布を持っているため、広く使用されている疑似乱数ジェネレーターです。独自の実装を作成しようとせず、利用可能なものを使用してください。

于 2012-05-17T22:07:03.487 に答える
3

/dev/random から必要なランダム ビットを読み取ることができます。

読み取り時に、/dev/random デバイスは、エントロピー プール内のノイズの推定ビット数内のランダム バイトのみを返します。/dev/random は、ワンタイム パッドやキー生成など、非常に高品質のランダム性が必要な用途に適しています。エントロピー プールが空の場合、追加の環境ノイズが収集されるまで /dev/random からの読み取りがブロックされます。 )

int randomSrc = open("/dev/random", O_RDONLY);
unsigned long seed[2];
read(randomSrc , seed, 2 * sizeof(long) );
close(randomSrc);
于 2012-05-17T22:07:41.413 に答える
3

アルゴリズムは決定論的であるため、非常にランダムにすることはできず、疑似ランダムのみを得ることができます。

Mac address + IP address + free space on HD + current free memory + epoch time in ms...

アルゴリズムのパフォーマンスが低下するリスクがあります。

ソリューションがインタラクティブな場合は、ユーザーに短いタイピング タスクを設定し、ランダム データを生成してもらうことができます。キーストローク間の時間を測定し、押したキーのコードを掛けます。同じ文字列のタイミングはわずかにずれます。少し混ぜて、開始時に mod 10 秒を取り、それらのキーストロークのみをカウントすることができます。

しかし、本当に 100% の乱数が必要な場合は、ANU Quantum Vacuum 乱数ジェネレーターを使用できます-記事

GitHub にプロジェクトがあります。これは、悪者を打ち負かすための非常に素晴らしい方法です。

于 2012-05-17T22:07:41.570 に答える