2012-05-14 50 views
0

因此,這裏的基本代碼:隨機呈現板20同樣出現

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     protected Random random; 

     public Form1() 
     { 
      InitializeComponent(); 
      random = new Random(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      bool button1Clicked = true; 
      if (button1Clicked == true) { ITIpanel.Visible = true; } 
     } 

     private void ITIpanel_Paint(object sender, PaintEventArgs e) 
     { 
      ITItimer.Enabled = true; 
     } 

     private void ITItimer_Tick(object sender, EventArgs e) 
     { 
      double rand = random.NextDouble(); 
      if (rand < .50d) { bluestimPanel.Visible = true; } 
      else if (rand > .5d) { redstimPanel.Visible = true; } 

      ITItimer.Enabled = false; 
     } 

     private void bluestimPanel_Paint(object sender, PaintEventArgs e) 
     { 
      Trialtimer.Enabled = true; 
     } 

     private void redstimPanel_Paint(object sender, PaintEventArgs e) 
     { 
      Trialtimer.Enabled = true; 
     } 

     private void Trialtimer_Tick(object sender, EventArgs e) 
     { 
      bluestimPanel.Visible = false; 
      redstimPanel.Visible = false; 
      Trialtimer.Enabled = false; 
      ITIpanel.Visible = true; 
     } 
    } 
} 

正如你所看到的,程序本身是相當簡單的。在ITItimer的勾號處,紅色或藍色面板隨機出現。我想對此進行修改,如果ITItimer總共打10次,紅色和藍色面板都會發生5次。

我一直在研究這一個星期左右,還沒有找到解決辦法。關於我如何最好地完成此任何想法?

我居然得到了以下工作:

double rand = random.NextDouble(); 
if (rand < .50d && blue < 5) { bluestimPanel.Visible = true; } 
else if (blue == 5) { redstimPanel.Visible = true; } 
if (rand > .5d && red < 5) { redstimPanel.Visible = true; } 
else if (red == 5) { bluestimPanel.Visible = true; } 
if (red >= 5 && blue >= 5) { panel1.Visible = true; } 

這不正是世界上最漂亮的東西。但它完成了工作。

+0

如果您的要求是,他們必須每個出現五次,那麼你不應該使用隨機數(至少不是完全)。雖然在統計上可能超過一個非常大的集合,其中一半將是紅色和一半藍色,但不能保證(特別是對於大多數即時隨機數生成器),當然不適用於這樣一個小樣本。 –

+5

聽起來就像你想隨機化你的點擊事件中的一組結果,並隨着計時器滴答而從它們中拉出來?考慮一下10張牌,並應用洗牌算法。 –

+0

@TetsujinnoOni就是這樣的。除了在這種情況下,假設您有兩種可能的試驗類型,並且一次會議由10次試驗組成。我想在這10個試驗中隨機地提出這兩種類型,這樣每個會話的開始和結束都是不同的。我對計算機編程相當陌生,所以任何幫助,將不勝感激。 – cwdaniels

回答

2

使用大多數常規庫例程的隨機數是僞隨機性的低質量來源。如果這是一個隨機科學研究,這將是你的協議設計的一個缺陷。

我建議的方法是考慮這是一種隨機安排至少N次試驗的方法,其中有X個試驗類型。

下面是用於說明該概念的僞代碼。

Let MinimumTrials be N MOD X + X 
Let SessionList be a List<Trial> 
For Each TrialType 
    add X instances of that trial type to SessionList 
Shuffle(SessionList) 

那麼你的會話引擎可以調用單獨的試驗,因爲它走過SessionList具有甚至可能的審單分佈。請注意,Shuffle是一項需要一定程度技巧才能正確使用的操作,搜索SO是一個很好的起點。

+0

添加到Tetsujin的回答這[SO問題](http://stackoverflow.com/questions/375351/most-efficient-way-to-randomly-sort-shuffle-a-list-of-integers-in-c-sharp )討論了很好的混洗算法。 –

+0

這正是我所期待的!非常類似於研究生在MED PC記譜法中使用的內容。 – cwdaniels