2009-05-26 32 views
11

乱数はどのように生成されますか? javaなどの言語はどのように乱数を生成しますか?特にGUIDの処理方法は?私はPseudorandomnumberジェネレータのようなアルゴリズムが初期値を使用することを発見しました。「ランダム」で「ユニーク」な数字を生成する方法は?

しかし、乱数プログラムを作成する必要があります。システムが再起動されても一度発生した数字は繰り返されません。私は数値をどこにでも格納する必要があると思ったので、そうでないと、リストが限界を越えると複雑すぎるでしょう。

+2

GUIDジェネレータが必要ですか?もしそうなら、お使いのプラットフォームにGUIDライブラリを使用する方法を教えてください。 –

+0

http://stackoverflow.com/questions/506118/how-to-manually-generate-random-numbersの重複(ほぼ) –

+0

@ S.Lott:ya。私はWindows XPとC#でVS2005を使用しています。 @BinaryWorrier:申し訳ありませんが、私はこの記事を投稿する際にstackoverflowの質問を見つけませんでした。 – SyncMaster

答えて

18

最初に:繰り返さないことが保証されている場合は、それほどランダムではありません。

2番目:PRNG algorithmsのロットがあります。

UPDATE:

第三:そこIETF RFC for UUIDsは(MSは、GUIDを呼ぶもの)ですが、あなたはその(U | G)認識すべきであるUIDをそれはあなたのために懸念される場合は、ない暗号的に安全です。

UPDATE 2:

あなたが実際に(だけでなく、あなた自身の啓発のために)製品コードに次のようなものを使用したい場合はくださいは、既存のライブラリを使用します。これは、あなたが以前にそれをやったことがない場合(またはあなたが持っていても)、微妙なバグを持つことがほぼ保証されている種類のコードです。

UPDATE 3:

は、ここでは、乱数を発生させる可能性が多くの方法がありますdocs for .NET's GUID

+0

+1:尋ねられたように質問に答えることができない場合、それはすべての拠点であると信じています。 –

+0

興味深いことに、LCG(http://en.wikipedia.org/wiki/Linear_congruential_generator)は直前の値だけが播種されていれば、非反復配列が作成されます。つまり、シーケンス全体が繰り返されるまで繰り返しはありません。 – Sionide21

+1

RNGは、それ自身を繰り返さないと確かにランダムである可能性があります。これは単にこれまでに選択されていない任意の数をピックする可能性があるだけです。 – MSalters

0

ほとんどの乱数ジェネレータには、シード値を「ランダムに」再分類する方法があります。 (ランダム化と呼ばれることもあります)。

これが不可能な場合は、システムクロックを使用してシードを初期化することもできます。

+1

システムクロックは悪い考えです。あなたがポーカーサイトを運営している場合、私は試行錯誤を行い、過去数枚のカードに基づいてあなたのシードを非常に簡単に作り出し、私たちの時計の時間差を推測します。 – SillyMonkey

3

です。これは、すでに説明したように、シード番号を持つジェネレータを使用するシステム/ライブラリ呼び出しで行われます。

しかし、TRUE乱数を得るために特殊なハードウェアを必要とする乱数を得る他の方法があります。この種のハードウェアを使用しているのはpoker sitesです。彼らのやり方を読むのはとても面白いです。

+0

恐らくこれは崩壊している粒子を見ることに基づいていますか?やあ、次の30分に行く。 – annakata

+0

hehehehehehehehehehehehehehehehehehehehehehehe –

+1

これは非常に不安定で、電流を流してから無作為に切り替えることができる、膝の近くにあるダイオードを使って行うことができます。 –

0

あなたは、このコードサンプル使用することができます http://xkcd.com/221/ をそれとも、あなたはこの本を使用することができます http://www.amazon.com/Million-Random-Digits-Normal-Deviates/dp/0833030477

しかし、真剣に、既存のライブラリを使用して、それを自分で実装していません。あなたはこれを行う最初の人になることはできません。具体的にJavaのに関する

0

  • java.util.Randomlinear congruential generatorを使用して、not very good
  • java.util.UUID#randomUUID()java.security.SecureRandom、安全な暗号化のRNGのさまざまなインタフェース使用している - デフォルトはSHA-1に基づいており、私は信じています。
  • UUIDs/GUIDs
  • 必ずしもランダムではありませんそれは私はあなたが生成する方法を模索していることを理解し、そのようなMersenne Twistermultiply-with-carry
0

としてjava.util.Randomよりもはるかに優れているネット上のRNGの実装を、見つけるのは簡単ですC#を使った乱数。はいの場合は、RNGCryptoServiceProviderがあなたの探しているものです。

[EDIT]

あなたがRNGCryptoServiceProviderを使用してバイトのかなり長い番号を生成した場合、ユニークである可能性が高いですが、何の島嶼地区などはありません。理論上、真の乱数はユニークではありません。あなたはサイコロを2回転がし、あなたは両方の時間に頭を上げるかもしれませんが、それらはまだランダムです。 TRUE RANDOM!

私はユニークであることのチェックを適用すると思うので、以前に生成された数字の履歴を保持する独自のメカニズムを公開するだけです。

関連する問題