0
  • プラットフォーム: x86 Linux 3.2.0 (Debian 7.1)
  • コンパイラ: GCC 4.7.2 (Debian 4.7.2-5)

「ランダムな」値に割り当てられたメモリの部分を読み取ることにより、「ランダムな」整数を生成する関数を作成しています。この考え方は、初期化されていない変数には未定義の値があるという事実に基づいています。私の最初のアイデアは、malloc() を使用して配列を割り当て、その初期化されていない要素を使用して乱数を生成することでした。ただし、malloc() はメモリの NULL ブロックを返す傾向があるため、読み取るものがあることを保証できません。そこで、NULL 以外の値をほぼ保証するために、別のプロセス メモリを読み取ることを考えました。私の現在のアイデアは、最初の有効なメモリアドレスを見つけてそこから読み取ることですが、これを行う方法がわかりません。ポインタを NULL に初期化してから 1 ずつインクリメントしようとしましたが、参照されたメモリ位置を出力しようとすると、セグメンテーション フォールトが発生します。したがって、私の質問は、別のプロセスメモリをどのように読み取るかです。メモリを読み取る以外に何もする必要はありません。

4

5 に答える 5

5

この考え方は、初期化されていない変数には未定義の値があるという事実に基づいています。

いいえ、できません。それらにはガベージ値があります。つまり、そのメモリに何が起こっても、それらはランダムではありません。

于 2013-08-20T00:57:39.147 に答える
3

ソフトウェアによってコンピューターで乱数を生成するのは困難です (ハードウェアの乱数ジェネレーターがあります)。新しいプログラムのメモリは、OS がプログラムを開始する前にすべてのメモリをゼロにしているため、特に早い段階でひどいソースです。表示されるゼロ以外は、初期化コードから残っているため、汚れが残っています。

「自分でやる」数字が必要だと仮定すると、時間のマイクロ/ナノ秒桁は古いスタイルのソリューションです...理論は以下に示されています...自分の数字で遊んでください。大きな素数を持つモジュロが良いでしょう。1/1,000 秒を超えるものは必ず破棄してください。

   (長い長い)(nano * 1E10 ) % 1000

これは、スケジュールされたジョブではなく手動コマンドで開始していることを前提としています。

UNIX で実行している場合は、/dev/urandom から数バイトを読み取るか、適切な注意を払って /dev/random (man ページを参照) を読み取ることを検討してください。

Windows には独自の API があります。パールでは、

   新しい Win32::API "advapi$b32","CryptAcquireContextA",'PNNNN','N' ||
                     die "$^E\n"; # MS 暗号を使用するか死ぬか

適切な乱数ジェネレーターが適切な数値を取得するために行う真剣な作業は、ここでは迅速な対応を超えています。通常、タイムスタンプ割り込みなどのハードウェアに依存します。

于 2013-08-20T01:20:33.550 に答える
2

この考え方は、初期化されていない変数には未定義の値があるという事実に基づいています。

それらが何を含んでいるかを予測できない限り、それらは定義されていません。実際に何が含まれているかは、ほとんどの場合 OS に依存します。

古い DOS の時代に戻ると、現在のセッションで複数のプログラムを実行すると、メモリにガベージが存在するという事実に頼ることができました。しかし、それでもデータはランダム性の信頼できるソースではありませんでした。

今日、物事は異なります。

  • スタックに変数があり、適切なプログラムの実行で、今ほどスタックに深入りしていない場合、ローカル変数は 0 です。それ以外の場合は、以前の関数呼び出しからのデータが含まれています。

  • あなたmalloc()とlibcがすでに使用されているメモリのプールから返されたメモリを取得すると、ガベージも含まれている可能性があります。ただし、OS から新たに取得した場合はゼロになります。

私の最初のアイデアは、malloc() を使用して配列を割り当て、その初期化されていない要素を使用して乱数を生成することでした。ただし、malloc() はメモリの NULL ブロックを返す傾向があるため、読み取るものがあることを保証できません。

(NULL ではなく、0 または NUL です。) 最後のポイントを参照してください。これは、malloc()ed 領域の履歴に依存します。

そこで、NULL 以外の値をほぼ保証するために、別のプロセス メモリを読み取ることを考えました。

プロセスが分離され、互いにシールドされているため、できません。

他の人が言ったように、ランダム性のより良いソースがあります。/dev/random本当のエントロピーが絶対に必要な場合、/dev/urandomそうでない場合。

于 2013-08-20T07:01:11.447 に答える