C# 使用随机间隔的计时器

C# 使用随机间隔的计时器,c#,random-sample,C#,Random Sample,我尝试使用下面的代码以随机间隔运行计时器。问题是,当我这样做时,我只发布了1个随机数,我不知道如何使用我的代码获取下一个随机数: using System; using System.Windows.Forms; namespace Auto_Typer { public partial class AutoTyper : Form { public AutoTyper() { InitializeComponent();

我尝试使用下面的代码以随机间隔运行计时器。问题是,当我这样做时,我只发布了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();
        }
    }
}
使用系统;
使用System.Windows.Forms;
名称空间自动键入器
{
公共部分类自动打字机:表单
{
公共自动打字机()
{
初始化组件();
tmrInterval.Tick+=新事件处理程序(间隔);
txtInterval.TextChanged+=新事件处理程序(TextChanged);
txtMin.TextChanged+=新事件处理程序(TextChanged);
txtMax.TextChanged+=新事件处理程序(TextChanged);
}
私有void TextChanged(对象发送方,事件参数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))
{
Text=(int.Parse(txtMin.Text)+1.ToString();
}
}
无效间隔(对象发送方、事件参数e)
{
SendKeys.Send(txtText.Text+“,+tmrInterval.Interval+“{enter}”);
}
私有void btnStart_单击(对象发送方,事件参数e)
{
如果(tbType.SelectedTab==tbInterval)
{
tmrInterval.Interval=int.Parse(txtInterval.Text)*1000;
tmrInterval.Enabled=真;
}
如果(tbType.SelectedTab==tbRange)
{
随机=新随机();
tmrInterval.Interval=(random.Next(int.Parse(txtMin.Text)、int.Parse(txtMax.Text))*1000);
tmrInterval.Enabled=真;
}
}
私有void btnStop_单击(对象发送方,事件参数e)
{
tmrInterval.Enabled=false;
}
私有void btnExit\u单击(对象发送者,事件参数e)
{
这个。关闭();
}
}
}

我建议将“new Random()”调用移到初始值设定项,然后每次需要新的随机数时,只需调用Random.Next()

有关Random()的详细信息,请访问:


随机不是真正的随机,而是伪随机。这意味着,给定相同的起始种子(随机实例化的参数),对Random.Next()的后续调用每次都将返回相同的值序列。好消息(谢谢,phoog)是默认构造函数(无参数)自动使用基于时间的种子。

我建议将“new Random()”调用移到初始值设定项,然后每次需要新的随机数时只调用Random.Next()

有关Random()的详细信息,请访问:


随机不是真正的随机,而是伪随机。这意味着,给定相同的起始种子(随机实例化的参数),对Random.Next()的后续调用每次都将返回相同的值序列。好消息(谢谢,phoog)是默认构造函数(无参数)自动使用基于时间的种子。

只需在回调方法中更改随机更改的间隔:

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}");
}

并且(如上所述)将
随机
实例作为类的成员字段,这样您就不必每次都重新创建它(如果以非常快的顺序调用,这可能会带来问题)。

只需更改回调方法中随机更改间隔的间隔:

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}");
}

并且(如上所述)使
随机
实例成为类的成员字段,这样您就不必每次都重新创建它(如果以非常快的顺序调用,这可能会带来问题)。

现在,每次单击按钮时都会创建
随机
实例,因为它是处理程序的本地实例。要在两次按压之间保持它,您需要将其设置为字段-

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;
}

现在,每次单击按钮时都会创建
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;
}

@帮助者-我会有同样的解决方案provided@HelpNeeder-与我提供的解决方案相同,当您可以调用默认构造函数时,为什么要使用当前勾号作为种子,该构造函数“使用依赖于时间的默认种子值初始化随机类的新实例”?当您可以调用默认构造函数时,为什么要使用当前勾号作为种子,该构造函数“使用依赖于时间的默认种子值初始化随机类的新实例”?