2012-01-21 10 views
4

"私は緑のコードを降らす"という行列のようなプログラムを作成しようとしています。すべての文字列インスタンスをリストにスローし、そこから描画/更新することに決めてしまうまで、すべてがうまくいっています。適切な効果を達成するために、私はいくつかのものを無作為化する必要があります。複数のオブジェクトの乱数生成

すべての文字列が作成され、forループでここに表示されるリストに格納されます。インターバルとドロップスピードの乱数は、文字列がどのくらい速く落ちるか、個々の文字がスプライトシートをどの速度で回転するかを変化させます。

何らかの理由で、私は一度にすべてのテキストの壁を取得していますが、すべてのスプライトは同じペースで回転しています。クラスとそれぞれの関数が動作します...私の乱数の初期化で何が間違っているのですか?

for (int i = 0; i < (wWidth/30); i++) 
{ 
    Random random = new Random(new System.DateTime().Millisecond); 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 
+6

'for'ループの外でランダムインスタンスを作成する必要があります。 –

答えて

6

あなたはrandomを作成する必要がありますforループ外インスタンス:new System.DateTime().Millisecondで播種

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString( 
       chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
} 

短い走行ループ内では、同じ作成されますシード値。したがって、同じ乱数。

+1

'Random'のパラメータのないコンストラクタはシードとしてシステム時刻を使用するので、おそらく渡すための新しい' DateTime'を作成する必要はありません( 'new Random()'を実行するだけです)。 –

+0

私はこれを試していた可能性があります...それは働いてくれてありがとう皆さん。 –

+0

これはかなり一般的な間違いですが、私の最後のゲームプロジェクトでは、デザインチームのほとんどすべてのスクリプト作成者が乱数が必要なたびに乱数生成器を再シードしていました。そして、事態を悪化させるために、彼らが使っていたTime()メソッドは壊れていたので、種は常に同じでした。それはMMOであり、サーバが数日間稼動したために壊れていることに気がつかなかったので、ログインした誰かが毎回再シードされていた場合を除いて、目立たないほど長く実行されていました。とにかく、私は今や散歩している。 –

2

あなたのループは「断食する」と各ループが速く1msの後、あるようにnew Random(new System.DateTime().Millisecond)が常に同じ結果をお届けしますです - 以下は動作するはずです:

Random random = new Random(new System.DateTime().Millisecond); 
for (int i = 0; i < (wWidth/30); i++) 
{ 
    float randInterval = NextFloat(random); 
    int dropSpeed = random.Next(1, 7); 
    _msList.Add(new MatrixString(chinese, randInterval, dropSpeed, dropSpeed, 1.0f, xOff, 10)); 
    xOff = i * 32; 
}