2016-05-11 16 views
1

擬似乱数を使用するJavaシステムを配布する必要があります。システムの各ノードは、一定量のランダムを処理する必要があります。擬似乱数を分割することは可能ですか

結果は再現可能でなければならないため、ランドームはパラメータとしてシードに依存する必要があります。

例えば
Random random = new Random(long seed); 

I 100 randomsを処理するために必要と私は2つのノードがある場合、最初のノードが1から50まで処理しなければならず、51〜100

に第二の問題はpseudorandomsが必要ということです毎回(同じ種子について)同じ乱数列を生成するために、繰り返し実行します。

前の例では、51番目のランダムから2番目のノードでランダムな生成を開始する方法はありますか? (したがって、このノードで1から50までの無作為を生成し、ゴミ箱から削除する必要はありません)。

+1

特にありません。あなたは、ノード間の乱数をどのように分割するかについての別の計画を考え出す方が良いでしょう。 2つのノードは最初の50と最後の50ではなく1つおきの乱数を使用します。ノード数を変更しても再現性が必要ですか?そうでなければ、最初の 'ランダム'によって生成されたシードで他の 'ランダム'インスタンスをキーイングすることで、物事をより簡単にすることができます。 –

+0

ええと...これは私の問題を解決することはできません。なぜなら、各ノードは100番目のランダムに処理しなければならないからです。 –

+0

擬似ランダムシーケンスを使用しないで、代わりにハッシュ関数を使用してください。最初のノードは1.50のハッシュを処理し、2番目のノードは51..100のハッシュを処理します –

答えて

0

random.nextInt(50) + 50について

同じシードを使用できますが、一方のノードでは "+ 0"を行い、もう一方のノードでは "+ 50"を実行します。

あなたが今すぐ両方のノードで同じシーケンスを50だけオフにするのが気に入らなければ、同じシードを使ってランダムジェネレータからノードごとにシードを作成できます。

すなわち

ノード1:

Random seedGenerator = new Random(globalSeed) 
Random myRandom = new Random(seedGenerator.nextInt()) 
int something = myRandom.nextInt(50) 

ノード2:

Random seedGenerator = new Random(globalSeed) 
seedGenerator.nextInt() // node 1's seed 
Random myRandom = new Random(seedGenerator.nextInt()) 
int something = myRandom.nextInt(50) + 50 

ノード1は、ノード、0と50の間であなたにint型を与える2、50〜100

+0

この戦略の問題は、ランダム性を処理するノードの量を変更する必要がある場合、動作しないことです。 3番目のノードではどうしたらいいですか?私はランダムに+100を加えなければならないでしょう。そして、1から100までのランダムのseqは同じではないでしょう。 –

+0

これは0と50の間の_numbers_を求めているのではなく、「ランダム」が生成する最初の50個の数字と、「ランダム」が生成する2番目の「50」の数字を必要とするものとして読んでいます。 –

0

擬似乱数列を生成する別の方法を使用することができます。ハッシュ関数(integ er-> integer)を代入して自然数にすると、シーケンスの項目はseed, step(seed), step(step(seed))ではなくhash(0), hash(1), hash(2)になります。この方法でO(1)の疑似ランダムシーケンスのi番目の要素にアクセスし、必要に応じてワークロードを配布することができます。

関連する問題