2016-05-12 18 views
0
using System; 
using System.Linq; 

namespace Loto 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      short[] tirage = new short[6]; //array that contains the numbers 
      short nbTirage; //the number randomed 

      for (int i = 0; i < 6; i++) 
      { 
       nbTirage = NombreAleatoire(); 

       while (tirage.Contains(nbTirage)) //if the number has already been drawn 
       { 
        nbTirage = NombreAleatoire(); //we random another one 
       } 

       Console.Write(nbTirage + " "); //writing the result 
      } 
     } 

     static short NombreAleatoire() 
     { 
      Random nb = new Random(); 
      return (short)nb.Next(1, 49); 
     } 
    } 
} 

これは完全なプログラムです。C#プログラムはステップオーバーモードでのみ正常に動作します

1から49までの7つのユニークな数字が含まれています。このプログラムはデバッグモードでうまく動作しますが、exeから実行すると同じ数の7倍の値が得られます。その原因は何ですか?私はVisual Studioを使用しています。

+1

Haveあなたはプログラムを再構築しようとしましたか? – Needham

+0

あなたは1つのランダムオブジェクトを保持し、次のオブジェクトを1つ呼び出す必要があります。+「tirage」を埋めていない+簡潔さのために名前空間とクラスを削除する可能性があります。 –

+0

LOTTOプログラムを作成しようとすると、勝つ..そうでなければ、私たち全員がloooooooooong時間前に金持ちになっていただろう。さらに、デバッガを使用してコードをステップ実行し、あなたが作成しているオブジェクトを検査すると、不足がどこで起きているかすぐにわかる。 – MethodMan

答えて

5

は、そのオブジェクトのすべてのインスタンスに同じ(時間ベースの)シードを与えるので、それらはすべて同じ番号を生成します。

のインスタンスをRandomとすると、進行中の番号が生成されます。このような何か:

Random nb = new Random(); 
for (int i = 0; i < 6; i++) 
{ 
    nbTirage = (short)nb.Next(1, 49); 

    while (tirage.Contains(nbTirage)) //if the number has already been drawn 
    { 
     nbTirage = (short)nb.Next(1, 49); //we random another one 
    } 

    Console.Write(nbTirage + " "); //writing the result 
} 

(注:あなたが経験あなたは、コードの実行を一時停止していない場合は、デバッグモードでこの同じ動作、を行うRandomためのシードは現在の時刻に基づいています。すべてのブレークポイントを削除してアプリケーションをデバッグモードで完全に実行させると、リリースモードで表示されているのと同じ動作になります)。

+0

ああ、私はそれを知らなかった。だから私はちょうど方法からそれを取る必要があります。シンプル。ありがとう – Lawliet

2

これは、Randomのデフォルトのシードが、各反復の時刻にシードする時刻なので、これが原因です。別の番号を取得するには、Randomオブジェクトを渡す必要があります。

繰り返し間の時間がずっと遅くてシードが変化しているので、デバッグのステップを実行しています。矢継ぎ早に新しいRandomオブジェクトを作成する

Random nb = new Random(); 

for (int i = 0; i < 6; i++) 
{ 
    nbTirage = NombreAleatoire(nb); 

    while (tirage.Contains(nbTirage)) //if the number has already been drawn 
    { 
     nbTirage = NombreAleatoire(nb); //we random another one 
    } 

    Console.Write(nbTirage + " "); //writing the result 
} 

static short NombreAleatoire(Random nb) 
{ 
    return (short)nb.Next(1, 49); 
} 
関連する問題