我正在尝试用c#制作一台老虎机,但有一个模糊的问题让我感到困惑。
我正在尝试将Bitmap[]
中的一些随机数据添加到List<Bitmap>
中:
public void Gamble()
{
for (int i = 0; i < 3; i++)
{
int r = (int)(new Random().NextDouble() * (fruits.Length - 1));
GambledFruits.Add(fruits[r]);
}
}
由于某种原因,List<Bitmap>
将第一次int r
添加3次。
但是当我像这样添加MessageBox
时:
public void Gamble()
{
for (int i = 0; i < 3; i++)
{
int r = (int)(new Random().NextDouble() * (fruits.Length - 1));
MessageBox.Show(r.ToString());
GambledFruits.Add(fruits[r]);
}
}
它显示了3个不同的随机数,它添加了3个不同的数字而不是3个相等的数字。
答案 0 :(得分:3)
随机不应该这样使用 - 你应该使用相同的实例三次:
public void Gamble()
{
var rnd = new Random();
for (int i = 0; i < 3; i++)
{
int r = (int)(rnd.NextDouble() * (fruits.Length - 1));
MessageBox.Show(r.ToString());
GambledFruits.Add(fruits[r]);
}
}
这是Random
的问题 - 它并不真正生成随机数(它只是伪随机数)。但是如果你使用相同的实例,它会比连续三次使用新实例更随机。
顺便说一下,你不必使用双随机数 - 你可以简单地使用它:
var r = rnd.Next(fruits.Length);
由于我认为messageBox只用于调试,你甚至可以使用类似的东西:
GambleFruits.AddRange(Enumerable.Repeat(new Random(), 3).Select(r => fruits[r.Next(fruits.Count)]));
而不是for循环。虽然这个解决方案更高效或更具可读性是有争议的,但我认为这是解决这个问题的一种更优雅的方式。
有关c#随机数生成的更多信息,请查看以下内容:https://www.dotnetperls.com/random。
我希望我能帮到你。
答案 1 :(得分:2)
您需要为所有迭代使用相同的Random
对象。您也不需要使用double
值:
public void Gamble()
{
Random rnd = new Random();
for (int i = 0; i < 3; i++)
{
int r = rnd.Next(fruits.Length);
GambledFruits.Add(fruits[r]);
}
}
但是如果你想拥有真正的随机值,你需要使用加密函数而不是Random
类。但请注意,这些值可能没有高斯分布。