2012-01-06 108 views
1

我想通過使用下面的代碼在隨機間隔中運行計時器。問題是,當我這樣做,我只能貼1的隨機數,我不知道如何用我的代碼獲取下一個隨機數:使用隨機時間間隔計時器

using System; 
using System.Windows.Forms; 

namespace Auto_Typer 
{ 
    public partial class AutoTyper : Form 
    { 
     public AutoTyper() 
     { 
      InitializeComponent(); 

      tmrInterval.Tick += new EventHandler(Interval); 

      txtInterval.TextChanged += new EventHandler(TextChanged); 
      txtMin.TextChanged += new EventHandler(TextChanged); 
      txtMax.TextChanged += new EventHandler(TextChanged); 
     } 

     private void TextChanged(object sender, EventArgs e) 
     { 
      if (int.Parse(txtInterval.Text) < 1 || int.Parse(txtMin.Text) < 1 || int.Parse(txtMax.Text) < 1) 
      { 
       txtInterval.Text = "1"; 
       txtMin.Text = "1"; 
       txtMax.Text = "1"; 
      } 
      else if (int.Parse(txtInterval.Text) > 100) 
      { 
       txtInterval.Text = "100"; 
       txtMin.Text = "100"; 
       txtMax.Text = "100"; 
      } 
      else if (int.Parse(txtMin.Text) >= int.Parse(txtMax.Text)) 
      { 
       txtMax.Text = (int.Parse(txtMin.Text) + 1).ToString(); 
      } 
     } 

     void Interval(object sender, EventArgs e) 
     { 
      SendKeys.Send(txtText.Text + ", " + tmrInterval.Interval + "{enter}"); 
     } 

     private void btnStart_Click(object sender, EventArgs e) 
     { 
      if (tbType.SelectedTab == tbInterval) 
      { 
       tmrInterval.Interval = int.Parse(txtInterval.Text) * 1000; 
       tmrInterval.Enabled = true; 
      } 

      if (tbType.SelectedTab == tbRange) 
      { 
       Random random = new Random(); 

       tmrInterval.Interval = (random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000); 
       tmrInterval.Enabled = true; 
      } 
     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      tmrInterval.Enabled = false; 
     } 

     private void btnExit_Click(object sender, EventArgs e) 
     { 
      this.Close(); 
     } 
    } 
} 

回答

4

我建議移動「新的隨機()」呼叫輸出到您的初始化程序,然後每次需要一個新的隨機數時調用Random.Next()。

上隨機的詳細信息():http://msdn.microsoft.com/en-us/library/h343ddh9.aspx

隨機不是真正隨機的,它是僞隨機的。這意味着給定相同的起始種子(給予隨機實例化的參數),隨後對Random.Next()的調用每次都會返回相同的值序列。好消息(謝謝,phoog)是默認構造函數(no args)自動使用基於時間的種子。

+0

爲什麼使用當前蜱作爲種子獲得一個隨機值時,你可以調用默認的構造函數,它「初始化一個新的實例Random類的使用時間依賴的默認種子值「? – phoog 2012-01-06 04:44:59

2

只要改變間隔的隨機變化區間回調方法:

private Random random = new Random(); 

void Interval(object sender, EventArgs e) 
{ 
    tmrInterval.Interval = (random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000); 
    SendKeys.Send(txtText.Text + ", " + tmrInterval.Interval + "{enter}"); 
} 

而且也(像上面)使你的類的實例Random成員字段,這樣你就不必重新每次新增一個(如果以非常快的順序調用,可能會帶來問題)。

+0

這可能是解決方案。 – HelpNeeder 2012-01-06 03:08:34

+1

@HelpNeeder - 我會提供相同的解決方案 – 2012-01-06 03:14:35

1

現在,每次單擊按鈕時都會創建Random實例,因爲它是處理程序的本地。要堅持它之間的印刷機,你需要把它做成一個領域。 -

private Random _random = new Random(); 

現在點擊處理程序可以從現場

if (tbType.SelectedTab == tbRange) 
{ 
    tmrInterval.Interval = (_random.Next(int.Parse(txtMin.Text), int.Parse(txtMax.Text)) * 1000); 
    tmrInterval.Enabled = true; 
}