【问题标题】:dont want a random number to show twice不希望随机数显示两次
【发布时间】:2014-03-18 20:13:56
【问题描述】:

我正在尝试将随机数保存在一个列表中,相同的数字不能出现两次。 这是一个 BINGO 游戏,此方法用于显示 ex B12,然后用户按 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.

【问题讨论】:

  • 所以首先生成所有可能的字母/数字的列表,然后打乱该列表,然后遍历该列表。只要您在列表中继续“前进”,就永远不会重复。
  • Randomize a List<T> in C# 的可能重复项

标签: c# shuffle


【解决方案1】:

这样的事情应该可以工作(如果我没看错你的问题)

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

【讨论】:

  • 这个答案暗示了一个非常好的解决方案,但您还没有完全遵循它。
【解决方案2】:

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

  1. 跟踪“呼叫”了哪些号码 - 如果列表中有号码,请选择其他号码
  2. 从原始列表中删除已调用的号码,然后每次随机选择一个新号码。
  3. 按随机数对可能值列表进行排序,然后在列表中工作

【讨论】:

    【解决方案3】:

    完成此操作的最简单方法是使用HashSet

    var usedNumbers = new HashSet<int>();
    ...
    int number;
    do {
        number = rnd.Next(1, 76);
    } while (usedNumbers.Contains(number));
    usedNumbers.Add(number); 
    

    【讨论】:

    • -1:这是最糟糕的 shuffle 实现之一,因为选择最后一个数字将比永远少一点(将选择 70 多个项目,随机数必须命中剩余 5 个项目之一- 插槽)。
    • 这取决于您将选择多少个数字。如果您从 76 中选择 10 个号码。不会有任何问题。 (让用户选择该组的所有号码会让他一直赢。)
    • 根据问题“这是一个 BINGO 游戏”,因此很有可能需要选择所有数字(或至少重要部分)。
    • @AlexeiLevenkov 它仍然只是 O(72^2),几乎任何计算机都可以处理
    • @OlivierJacot-Descombes 你有没有玩过宾果游戏并且有一个号码不在你的表上?
    猜你喜欢
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多