【问题标题】:How to create a true 'Random' with Timer control?如何使用 Timer 控件创建真正的“随机”?
【发布时间】:2015-03-28 20:20:30
【问题描述】:

我有一个点击按钮的计时器,无论计时器的速度如何,由于Random 与时钟有某种关联,因此无论速度如何,结果都是可预测的。

我一直在阅读并了解到,当初始化一个新的Random 时,它是通过系统时间完成的,这就解释了为什么我会遇到这个问题。

这是我所拥有的:

   int win = 0;
   int lose = 0;

    private void button1_Click(object sender, EventArgs e)
    {
        Random rn = new Random();
        int rnu = rn.Next(2);

        if (rnu == 0)
            win++;

        if (rnu == 1)
            lose++;

          string winmsg = "Wins: " + win.ToString();
          string losemsg = "Losses: " + lose.ToString();

        winlbl.Text = winmsg;
        loselbl.Text = losemsg;

        timer1.Start();

    }

然后是计时器:

    private void timer1_Tick(object sender, EventArgs e)
    {
        button1.PerformClick(); //interval 500, but always predictable.
    }

我的目标是尝试创建一个更“随机”的结果 - 一个计时器控件无法预测的结果。但是,我无法修改计时器的速度;它必须在循环中保持不变。

我尝试停止计时器并重新启动,但即便如此,它仍会继续进行可预测的行为。

有没有人知道解决这个问题的方法或某种“技巧”?还是这是一些 C# Random 限制?

【问题讨论】:

    标签: c# random timer


    【解决方案1】:

    我一直在阅读并了解到,当初始化一个新的 Random 时,它是使用系统时间完成的,这解释了为什么我会遇到这个问题。

    然后将Random移到方法外,不要重新初始化它。

    Random rn = new Random(); 
    
    private void button1_Click(object sender, EventArgs e)
    {
    

    Random 类的要点是,您的程序中不应有太多实例,因为它们可以同时被初始化。对于每个线程(在其中使用它),完美的数字将恰好是一个。 Winforms 事件都在主线程中运行。

    【讨论】:

    • 我应该知道的更多>_
    猜你喜欢
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多