如何用Timer控件创建一个真正的'Random'?
How to create a true 'Random' with Timer control?
我有一个点击按钮的计时器,无论计时器的速度如何,由于 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.
}
我的目标是尝试创造更多 'Random' 的结果 - 使用计时器控件无法预测的结果。但是,我无法修改计时器的速度;它必须在循环中保持不变。
我试过停止计时器并重新启动,但即便如此它仍会执行可预测的行为。
有谁知道解决此问题或某种 'trick' 的方法吗?或者这是一些 C# Random
限制?
I have been reading up and learned that when a new Random is initialized, it is done so with the system time, which explains why I'm getting this problem.
然后将 Random
移到方法之外,不要重新初始化它。
Random rn = new Random();
private void button1_Click(object sender, EventArgs e)
{
Random
class 的要点是你的程序不应该有太多实例,因为它们可以同时初始化。完美的数字对于每个线程(您在其中使用它)正好是一个。主线程中的所有 运行 Winforms 事件。
我有一个点击按钮的计时器,无论计时器的速度如何,由于 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.
}
我的目标是尝试创造更多 'Random' 的结果 - 使用计时器控件无法预测的结果。但是,我无法修改计时器的速度;它必须在循环中保持不变。
我试过停止计时器并重新启动,但即便如此它仍会执行可预测的行为。
有谁知道解决此问题或某种 'trick' 的方法吗?或者这是一些 C# Random
限制?
I have been reading up and learned that when a new Random is initialized, it is done so with the system time, which explains why I'm getting this problem.
然后将 Random
移到方法之外,不要重新初始化它。
Random rn = new Random();
private void button1_Click(object sender, EventArgs e)
{
Random
class 的要点是你的程序不应该有太多实例,因为它们可以同时初始化。完美的数字对于每个线程(您在其中使用它)正好是一个。主线程中的所有 运行 Winforms 事件。