2017-04-19 35 views
0

我想在c#中制作一台老虎机,但有一个模糊的问题让我困惑。尝试将随机数组数据添加到列表时奇怪的代码失败<Bitmap>

我试图从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

在每次迭代中使用相同的'''Random'''对象,而不是新的对象实例。 –

+0

你正在使用'Random' - 你应该只构造一次,因为它使用当前时间作为种子值(我认为,到最接近的毫秒),所以它会重复值。 – Dai

+0

这是完整的代码。 ?列表在哪里使用。 – user2526236

回答

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级加密功能。但请注意,这些值可能不具有高斯分布。

+1

出于赌博的目的,比缺少高斯分布更大的问题是“随机”是可预测的。是的,人们(例如穆拉特布利夫)已经在真正的老虎机上利用了这个缺陷。 – Brian

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

我希望我能帮助你。

+0

非常感谢您的解释! :D –

+0

我正在考虑类似的'GambledFruits.AddRange(Enumerable。重复(new Random(),3).Select(r => fruits [r.Next(fruits.Length)]));'因为'Repeat'将使用相同的'Random'实例 – Slai

+0

@Slai,来自@MetaColon的代码在''''0'''中工作''Repeat()'''完全不用。你的解决方案也很好,因为它不需要额外的局部变量来处理Random实例。 –