C# 不要让随机数显示两次

C# 不要让随机数显示两次,c#,shuffle,C#,Shuffle,我试图将随机数保存在一个列表中,同一个数字不能出现两次。 这是一个宾果游戏,使用这种方法显示exb12,然后用户点击enter,就会显示一个新的数字。这将一直持续到用户写入q 这是可行的,但数字可以显示两次 static void bingo() { Random rnd =new Random(); List<int> check = new List<int>(); string choice = ""; while (choice

我试图将随机数保存在一个列表中,同一个数字不能出现两次。 这是一个宾果游戏,使用这种方法显示exb12,然后用户点击enter,就会显示一个新的数字。这将一直持续到用户写入q

这是可行的,但数字可以显示两次

static void bingo()
{
    Random rnd =new Random();
    List<int> check = new List<int>();
    string choice = "";

    while (choice != "Q")
    {
        int number = rnd.Next(1, 76);

        while (!check.Contains(number))
        { 
            kontroll.Add(number); 
        }
        if (number <=15)
        {
            choice = Interaction.InputBox("B" + number);
            choice = choice.ToUpper();
        }
        else if(number <= 30)

        etc.
static void bingo()
{
随机rnd=新随机();
列表检查=新列表();
字符串选择=”;
while(选项!=“Q”)
{
整数=rnd.Next(1,76);
而(!check.Contains(number))
{ 
添加(编号);
}

如果(数字这样的东西应该行得通(如果我没看错你的问题)


Enumerable.Range(1,76).OrderBy(n=>rnd.NextDouble())

有几种方法可以做到这一点:

  • 跟踪“呼叫”的号码-如果列表中有号码,请选择其他号码
  • 从原始列表中删除已调用的号码,然后每次随机选择一个新号码
  • 按随机数对可能值的列表进行排序,只需遍历列表即可

  • 实现这一点的最简单方法是使用
    HashSet

    var usedNumbers = new HashSet<int>();
    ...
    int number;
    do {
        number = rnd.Next(1, 76);
    } while (usedNumbers.Contains(number));
    usedNumbers.Add(number); 
    
    var usedNumbers=new HashSet();
    ...
    整数;
    做{
    编号=rnd.Next(1,76);
    }while(usedNumbers.Contains(number));
    使用编号。添加(编号);
    
    因此,首先生成一个包含所有可能字母/数字的列表,然后将该列表洗牌,然后在列表中迭代。只要你继续“前进”,就永远不会有重复在列表中。这个答案的可能重复提示了一个非常好的解决方案,但您还没有完全遵循它。-1:这是最糟糕的洗牌实现之一,因为选择最后一个数字将花费比永远少一点的时间(将选择70多个项目,随机数将必须命中剩余5个插槽中的一个)。这取决于你将选择多少个数字。如果你从76个数字中选择10个,这将不会有问题。(让用户选择集合中的所有数字将让他一直获胜。)根据问题“这是一个宾果游戏”,因此很有可能需要选择所有数字(或至少是重要部分)@AlexeiLevenkov它仍然只是O(72^2),几乎任何计算机都能做到handle@OlivierJacot-Descombes你有没有玩过宾果游戏,有人叫过一个号码,但你的号码表上没有?