【问题标题】:C# How to randomize the number on 10 buttons (0 - 9) without duplicates [duplicate]C#如何随机化10个按钮(0-9)上的数字而不重复[重复]
【发布时间】:2017-10-09 01:46:58
【问题描述】:

1.这就是我到目前为止所得到的

2.它应该在启动时随机化按钮上的数字。但它仍然会产生重复(而且我不想要重复)。

  1. 我为此使用 Visual Studio 2012 C#

  2. 只有在我启动程序后才应该这样做。所以它是一次性随机化

                Random rand = new Random();
                int RandomOne = rand.Next(0, 10);
                int RandomTwo = rand.Next(0, 10);
                int RandomThree = rand.Next(0, 10);
                int RandomFour = rand.Next(0, 10);
                int RandomFive = rand.Next(0, 10);
                int RandomSix = rand.Next(0, 10);
                int RandomSeven = rand.Next(0, 10);
                int RandomEight = rand.Next(0, 10);
                int RandomNine = rand.Next(0, 10);
                int RandomZero = rand.Next(0, 10);
    
                btnOneNgra.Text = Convert.ToString(RandomOne);
    
    
                if ((RandomTwo == RandomOne) || (RandomTwo == RandomNine) || (RandomTwo == RandomThree) || (RandomTwo == RandomFour)
                    || (RandomTwo == RandomFive) || (RandomTwo == RandomSix) || (RandomTwo == RandomSeven) || (RandomTwo == RandomEight) || (RandomTwo == RandomZero))
                {
                    RandomTwo = rand.Next(0, 10);
                }
                else 
                {
                    btnTwoNgra.Text = Convert.ToString(RandomTwo);
                }
    
    
                if ((RandomThree == RandomOne) || (RandomThree == RandomTwo) || (RandomThree == RandomNine) || (RandomThree == RandomFour)
                    || (RandomThree == RandomFive) || (RandomThree == RandomSix) || (RandomThree == RandomSeven) || (RandomThree == RandomEight) || (RandomThree == RandomZero))
                {
                    RandomThree = rand.Next(0, 10);
                }
                else
                {
                    btnThreeNgra.Text = Convert.ToString(RandomThree);
                }
    
    
                if ((RandomFour == RandomOne) || (RandomFour == RandomTwo) || (RandomFour == RandomThree) || (RandomFour == RandomNine)
                    || (RandomFour == RandomFive) || (RandomFour == RandomSix) || (RandomFour == RandomSeven) || (RandomFour == RandomEight) || (RandomFour == RandomZero))
                {
                    RandomFour = rand.Next(0, 10);
                }
                else
                {
                    btnFourNgra.Text = Convert.ToString(RandomFour);
                }
    
    
                if ((RandomFive == RandomOne) || (RandomFive == RandomTwo) || (RandomFive == RandomThree) || (RandomFive == RandomFour)
                    || (RandomFive == RandomNine) || (RandomFive == RandomSix) || (RandomFive == RandomSeven) || (RandomFive == RandomEight) || (RandomFive == RandomZero))
                {
                    RandomFive = rand.Next(0, 10);
                }
                else
                {
                    btnFiveNgra.Text = Convert.ToString(RandomFive);
                }
    
    
                if ((RandomSix == RandomOne) || (RandomSix == RandomTwo) || (RandomSix == RandomThree) || (RandomSix == RandomFour)
                    || (RandomSix == RandomFive) || (RandomSix == RandomNine) || (RandomSix == RandomSeven) || (RandomSix == RandomEight) || (RandomSix == RandomZero))
                {
                    RandomSix = rand.Next(0, 10);
                }
                else
                {
                    btnSixNgra.Text = Convert.ToString(RandomSix);
                }
    
    
                if ((RandomSeven == RandomOne) || (RandomSeven == RandomTwo) || (RandomSeven == RandomThree) || (RandomSeven == RandomFour)
                    || (RandomSeven == RandomFive) || (RandomSeven == RandomSix) || (RandomSeven == RandomNine) || (RandomSeven == RandomEight) || (RandomSeven == RandomZero))
                {
                    RandomSeven = rand.Next(0, 10);
                }
                else
                {
                    btnSevenNgra.Text = Convert.ToString(RandomSeven);
                }
    
    
                if ((RandomEight == RandomOne) || (RandomEight == RandomTwo) || (RandomEight == RandomThree) || (RandomEight == RandomFour)
                    || (RandomEight == RandomFive) || (RandomEight == RandomSix) || (RandomEight == RandomSeven) || (RandomEight == RandomNine) || (RandomEight == RandomZero))
                {
                    RandomEight = rand.Next(0, 10);
                }
                else
                {
                    btnEightNgra.Text = Convert.ToString(RandomEight);
                }
    
    
                if ((RandomNine == RandomOne) || (RandomNine == RandomTwo) || (RandomNine == RandomThree) || (RandomNine == RandomFour)
                    || (RandomNine == RandomFive) || (RandomNine == RandomSix) || (RandomNine == RandomSeven) || (RandomNine == RandomEight) || (RandomNine == RandomZero))
                {
                    RandomNine = rand.Next(0, 10);
                }
                else 
                {
                    btnNineNgra.Text = Convert.ToString(RandomNine);
                }
    
    
                if ((RandomZero == RandomOne) || (RandomZero == RandomTwo) || (RandomZero == RandomThree) || (RandomZero == RandomFour)
                    || (RandomZero == RandomFive) || (RandomZero == RandomSix) || (RandomZero == RandomSeven) || (RandomZero == RandomEight) || (RandomZero == RandomNine))
                {
                    RandomZero = rand.Next(0, 10);
                }
                else
                {
                    btnZeroNgra.Text = Convert.ToString(RandomZero);
                }
    

【问题讨论】:

  • 一种解决方案可能是将数字(0-9)添加到列表中,随机播放并选择一个随机索引,删除索引处的元素。重复。编辑:也许选择下一个索引 - 不是洗牌后的随机索引。
  • 您需要在 while 循环中执行此操作,而不是单个 if 语句。如果您检查一次然后更改它,它可能会得到与另一个相同的值。
  • @Achilles 这当然是更好的解决方案。
  • 你能给我一个我应该如何做的示例代码吗?我还是个学生,需要学习
  • @NoahDeGraaff 如果你需要学习,我建议你去尝试一下。从 SO 复制代码不会教你任何东西。

标签: c# random unique


【解决方案1】:

这种情况的方法应该是在一个列表中创建十个数字,然后一个一个地取以避免重复,如下所示:

List<int> nums = new List<int>(Enumerable.Range(0, 10));

private int getNumber(){
    Random rand = new Random();
    int index = rand.Next(0, nums.Count);
    int num = nums[index];
    nums.RemoveAt(index);
    return num;
}

你可能需要小心,它不能被调用超过 10 次......你可能想要创建小的错误处理程序,例如:

private int getNumber(){
    if(nums.Count >= 0)
        return -1; //means not available
    Random rand = new Random();
    int index = rand.Next(0, nums.Count);
    int num = nums[index];
    nums.RemoveAt(index);
    return num;
}

【讨论】:

  • 我推荐使用Enumerable.Range(0, 9) 来生成数字列表。这样你就可以让它动态化。
  • @DavidG 好主意...因为第二个元素是count 我想我应该选择0,10
  • 我认为.ToList() 看起来更好,但这也有效:)
【解决方案2】:

也许你应该尝试使用 HashSet:

HashSet<int> numbers = new HashSet<int>();
Random randomizer = new Random();

while (numbers.Count < 10)
{
   numbers.Add(randomizer.Next(0, 10));
}

HashSet 将确保所有值都是唯一的。

【讨论】:

  • 它也会抛出一个异常并且不会给你从 0 到 9 的所有数字而不可能运行很长时间(从概率的角度来看)
  • 不会抛出异常
  • 好的,是的,它不会抛出异常,但循环会运行几十次不必要的次数。
  • 对于信息,我已经测试了几次。有时它需要不到 20 个循环,有时它需要超过 100 个。
猜你喜欢
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2015-07-12
  • 2015-01-09
  • 1970-01-01
相关资源
最近更新 更多