C# 尝试将随机数组数据添加到列表时出现奇怪的代码错误<;位图>;

C# 尝试将随机数组数据添加到列表时出现奇怪的代码错误<;位图>;,c#,C#,我想用c#制作一台老虎机,但有一个模糊的问题让我困惑 我正在尝试将位图[]中的一些随机数据添加到列表中: 它向我显示了3个不同的随机数,并将3个不同的数相加,而不是3个相等的数。随机数不应这样使用-应使用同一实例三次: public void Gamble() { var rnd = new Random(); for (int i = 0; i < 3; i++) { int r = (int)(rnd.Ne

我想用c#制作一台老虎机,但有一个模糊的问题让我困惑

我正在尝试将
位图[]
中的一些随机数据添加到
列表中


它向我显示了3个不同的随机数,并将3个不同的数相加,而不是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]);
        }
    }
因为我相信messageBox只用于调试,所以您甚至可以使用类似的东西:

GambleFruits.AddRange(Enumerable.Repeat(new Random(), 3).Select(r => fruits[r.Next(fruits.Count)]));
而不是for循环。虽然这个解决方案是否更有效或更具可读性是有争议的,但我认为这是一个更优雅的解决方法

有关c#随机数生成的更多信息,请查看以下内容:


我希望我能帮助您。

Random不应该这样使用-您应该使用同一个实例三次:

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]);
        }
    }
因为我相信messageBox只用于调试,所以您甚至可以使用类似的东西:

GambleFruits.AddRange(Enumerable.Repeat(new Random(), 3).Select(r => fruits[r.Next(fruits.Count)]));
而不是for循环。虽然这个解决方案是否更有效或更具可读性是有争议的,但我认为这是一个更优雅的解决方法

有关c#随机数生成的更多信息,请查看以下内容:


我希望我能帮助您。

您需要在所有迭代中使用相同的
Random
对象。此外,您不需要使用
值:

public void Gamble()
{
    Random rnd = new Random();
    for (int i = 0; i < 3; i++)
    {
        int r = rnd.Next(fruits.Length);

        GambledFruits.Add(fruits[r]);
    }
}
public void Gamble()
{
随机rnd=新随机();
对于(int i=0;i<3;i++)
{
int r=下一个(果实长度);
GambledFruits.Add(水果[r]);
}
}

但是如果你想要真正的随机值,你需要使用加密函数而不是
random
class。但请注意,这些值不能具有高斯分布。

所有迭代都需要使用相同的
随机对象。此外,您不需要使用
值:

public void Gamble()
{
    Random rnd = new Random();
    for (int i = 0; i < 3; i++)
    {
        int r = rnd.Next(fruits.Length);

        GambledFruits.Add(fruits[r]);
    }
}
public void Gamble()
{
随机rnd=新随机();
对于(int i=0;i<3;i++)
{
int r=下一个(果实长度);
GambledFruits.Add(水果[r]);
}
}


但是如果你想要真正的随机值,你需要使用加密函数而不是
random
class。但请注意,这些值可能没有高斯分布。

在每次迭代中使用相同的
随机
对象,而不是新的对象实例化。您使用的
随机
不正确-您应该只构造一次,因为它使用当前时间作为种子值(我认为,精确到毫秒)所以它会重复值。这是完整的代码吗?使用列表的位置。非常感谢@UladzimirPalekh,这很有效:)和@Dai当然在每次迭代中使用相同的
Random
对象,而不是新的对象实例化。您使用的
Random
不正确-您应该只构建一次,因为它使用当前时间作为种子值(我认为,精确到毫秒)所以它会重复值。这是完整的代码吗?列表在哪里使用。非常感谢@UladzimirPalekh,这很有效:)和@Dai当然非常感谢您的解释!:DI想到了类似的东西
GambledFruits.AddRange(Enumerable.Repeat(new Random(),3).Select(r=>fruits[r.Next(fruits.Length)])因为
重复
将使用相同的
随机
instance@Slai,来自@MetaColon的代码在
Repeat()中以
0
的方式工作。
完全不使用。您的解决方案也很好,因为它不需要为
Random
实例添加额外的局部变量。非常感谢您的解释!:DI想到了类似的东西
GambledFruits.AddRange(Enumerable.Repeat(new Random(),3).Select(r=>fruits[r.Next(fruits.Length)])因为
重复
将使用相同的
随机
instance@Slai,来自@MetaColon的代码在
Repeat()中以
0
的方式工作。
完全不使用。您的解决方案也很好,因为它不需要为
Random
实例添加额外的局部变量。为了赌博,比缺少高斯分布更大的问题是
Random
是可预测的。是的,人们(比如穆拉特·布利耶夫)已经在真正的老虎机上利用了这个漏洞。为了赌博,比缺少高斯分布更大的问题是,
随机
是可预测的。是的,人们(比如穆拉特·布利耶夫)已经在真正的老虎机上利用了这个漏洞。