2011-10-02 13 views
5

乱数を生成するためのc#/ XNAプロセスはかなり簡単で簡単ですが、これまでに見た乱数ジェネレータを配布するのに最悪の可能性があります。 C#/ XNAの実装が容易な優れた方法はありますか?C#/ XNA疑似乱数生成

rand.Next()は私のニーズに合っていません。

から:

静的プライベートランダムランド=新しいランダム();

私は自分のプログラム全体にオブジェクトをランダムに配置します。場合によっては10、ときには200になります。

ランダムオブジェクト(x valとy valは両方とも2d平面上でランダムです)を呼び出すとき、それらはグループ化されます。世代コードはきれいで、きれいに呼び出され、きれいに反復され、各値とともに新しい乱数が取り出されます。しかし、彼らはグループ、顕著に悪い、それはあまりにも乱数ではよくないです。私はC#との中間的なスキルですが、as3から渡ったので、ランダム性をよりよく処理するようでした。

私はそれらが擬似ランダムであることをよく承知していますが、WindowsシステムではC#がグロテスクです。

+0

乱数生成プロセスを参照していますか? 'System.Random'? –

+0

あなたのニーズは何ですか? – PostMan

+0

もう少し詳しく知りましたが、更新しました。そして義務的な嘆き+泣き言。 – SimpleRookie

答えて

2

XNAのSystem.Security.Cryptography.RandomNumberGeneratorを使用できますか?

var rand = RandomNumberGenerator.Create(); 
byte[] bytes = new byte[4]; 

rand.GetBytes(bytes); 

int next = BitConverter.ToInt32(bytes, 0); 

最小/最大範囲内の値を取得するために:私は、単純なXORのalgorythmを使用する私のプロジェクトのために

static RandomNumberGenerator _rand = RandomNumberGenerator.Create(); 

static int RandomNext(int min, int max) 
{ 
    if (min > max) throw new ArgumentOutOfRangeException("min"); 

    byte[] bytes = new byte[4]; 

    _rand.GetBytes(bytes); 

    uint next = BitConverter.ToUInt32(bytes, 0); 

    int range = max - min; 

    return (int)((next % range) + min); 
} 
+0

どのようにそのメソッドの最小値と最大値を設定しますか? – SimpleRookie

+1

最小値/最大値の例を挙げてください。 –

+0

0-10、1-200、-100-100、標準品。 – SimpleRookie

1

それはまた、あなたがSystem.Randomを使用しているかに依存してもよいです。一般的には、Randomという新しいインスタンスを繰り返し作成することはお勧めできません。同じ時刻に作成されたRandomオブジェクトには、同じ乱数が設定されている可能性が非常に高くなります(デフォルトでは、時間はシードとして使用されます) )代わりに、ランダムインスタンスを1つ作成し、そのインスタンスだけをプログラム全体で使用します。

セキュリティが目標でない限り、これはおそらくこの場合ではありませんが、System.Randomを使用する方がよいでしょう。