如何创建一个真正的';随机';带定时器控制

本文关键字:随机 控制 定时器 创建 何创建 一个 | 更新日期: 2025-02-19 09:40:13

我有一个点击按钮的计时器,无论计时器的速度如何,由于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的限制?

如何创建一个真正的';随机';带定时器控制

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

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

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

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