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

3 に答える 3

4

「newRandom()」呼び出しを初期化子に移動し、新しい乱数が必要になるたびにRandom.Next()を呼び出すことをお勧めします。

Random()の詳細については、http://msdn.microsoft.com/en-us/library/h343ddh9.aspxを参照してください。

ランダムは実際にはランダムではなく、疑似ランダムです。これは、同じ開始シード(ランダムインスタンス化に与えられた引数)が与えられた場合、その後のRandom.Next()の呼び出しは、毎回同じ値のシーケンスを返すことを意味します。良いニュース(ありがとう、phoog)は、デフォルトのコンストラクター(引数なし)が自動的に時間ベースのシードを使用することです。

于 2012-01-06T02:58:22.880 に答える
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インスタンスをクラスのメンバーフィールドにして、毎回更新する必要がないようにします(非常に速い順序で呼び出されると問題が発生する可能性があります)。

于 2012-01-06T03:00:04.390 に答える
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;
}
于 2012-01-06T03:07:12.953 に答える