我在c#程序中遇到了一个奇怪的问题。该程序的目的是掷骰子并显示其输出。该程序的逻辑很好,只有当我输出到消息框时才有效。这是代码:
private void btnRoll_Click(object sender, EventArgs e)
{
lbDice.Items.Clear();
int[] rolls = new int[13];
for (int i = 1; i < numTxt.Value; i++) {
int index = new Random().Next(1, 7) + new Random().Next(1, 7);
//MessageBox.Show(index + ""); THIS LINE IS REQUIRED
rolls[index] += 1;
}
updateList(rolls);
}
public void updateList(int[] rolls)
{
for (int i = 1; i < rolls.Length; i++)
{
lbDice.Items.Add("" + i + " " + rolls[i]);
}
}
如果不存在,程序将只为每个索引添加1。
答案 0 :(得分:1)
根据我的经验,这与Random类如何生成随机数有关。多次执行new Random()
可以为每种情况创建相同的值。
仅尝试创建Random
类实例一次:
Random rand = new Random();
for (int i = 1; i < numTxt.Value; i++) {
int index = rand.Next(1, 7) + rand.Next(1, 7);
rolls[index] += 1;
}
作为实验,您可以将MessageBox
行替换为Sleep
,看看是否也有效
答案 1 :(得分:0)
无需每次都创建一个Random实例。保留它并重复使用它。 如果您创建的实例距离太近,它们将产生与随机生成器从系统时钟播种相同的随机数序列。
此代码(如下)可能会对您有所帮助。
using System;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Please provide a number and press 'Enter'");
var input = Console.ReadLine();
int lenght;
if (!int.TryParse(input, out lenght))
{
lenght = 10;
}
int l = 13;
int[] rolls = new int[l];
var rnd = new Random();
for (int i = 1; i < lenght; i++)
{
int index = rnd.Next(1, 7) + rnd.Next(1, 7);
//MessageBox.Show(index + ""); THIS LINE IS REQUIRED
rolls[index] += 1;
}
for (int i = 0; i < l; i++)
{
Console.WriteLine($"rolls[{i}] = {rolls[i]}");
}
Console.WriteLine("Done. Prss any key to exit");
Console.ReadKey();
}
}
}
总的来说,我认为这与this question
有关 祝你好运!