尝试将随机数组数据添加到List <bitmap>

时间:2017-04-19 21:52:34

标签: c#

我正在尝试用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个相等的数字。

2 个答案:

答案 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类。但请注意,这些值可能没有高斯分布。