-1

Task純粋に実験的な理由で、 C#でsを使用して疑似乱数ジェネレーターを作成しようとしています。

2つのタスクと2つの静的変数glo_aとがありglo_countます。glo_a最終結果(7ビットのランダムな2進整数)を保持することになっています。

public static int glo_a = 0, glo_count = 6;

Private void button1_Click(object sender, RoutedEventArgs e)
{
  Task task = new Task(() => this.display(1));
  Task task2 = new Task(() => this.display(0));

  task.Start();
  task2.Start();

  Task.WaitAll();
  textBox1.AppendText("\n" + glo_a);
}

public void display(int j)
{
  for (; glo_count >= 0; glo_count--)
  {  
    glo_a += j * (int)Math.Pow(10,glo_count);
  }
}

private void refreshbutton_Click(object sender, RoutedEventArgs e)
{
  /* reset the original values*/  
  glo_a = 0;
  glo_count = 6;
  textBox1.Text = "";  
}

私が抱えている問題は、最初に実行され、毎回開始taskする前に完了することです。task2

4

2 に答える 2

3

タスクには実行する可能性がほとんどないため、タスクは次々に実行されることになります。最初にtask1を開始したため、最初に実行される可能性があります。

他の回答が言っているように、Randomクラスを使用するだけです。

于 2011-05-06T06:58:50.993 に答える
2

これを使用して「ビット」を生成しているだけではない理由を尋ねることができますか?

Random r = new Random();
r.Next(2);

またはそれ以上:

Random r = new Random();
byte[] randomBytes = new byte[7];
r.NextBytes(randomBytes);

いずれにせよ、あなたがしていることをするための奇妙な要件があると仮定して、それらが順番に実行されていると確信していますか?

最初のタスクは、2番目のタスクが開始する前に終了している可能性が高いと思います。

いずれにせよ、これは同じことですが、次のことを試すことができます。

Task.WaitAll(
    new Task( () => this.display(1) ),
    new Task( () => this.display(0) )
);

持っているものを必死に使用したい場合は、ランダム生成を実行して、最初に開始するタスクを決定できます。

Random r = new Random();

Task task = new Task(() => this.display(1));
Task task2 = new Task(() => this.display(0));
Task[] tasks = new [] { task, task2 };

/* Only supports 2 tasks */
int firstTask = r.Next(2); 

tasks[firstTask].Start();
tasks[firstTask ^ 1].Start();

Task.WaitAll();
于 2011-05-06T06:53:27.693 に答える