【问题标题】:Random Numbers from preset list预设列表中的随机数
【发布时间】:2016-03-29 02:22:44
【问题描述】:

我是一名学生,正在做一个中期项目。我不是在找人为我编写代码,但我需要部分帮助。我正在尝试制作二十一点游戏,为此我想为一副牌中的每张牌设置一个包含 52 个整数 [1,1,1,1,2,2,2,2 .....] 的列表.但是如何从列表中取出一个随机数并将其取消呢?就像普通套牌一样,一旦你拿了一张牌,你就不能重画它。我知道 a 可以为程序设置一个随机参数 [n = rand () % 11 + 1] 但我想超越以获得 A

【问题讨论】:

    标签: c arrays list random


    【解决方案1】:

    无法从数组中删除随机元素。
    您可以做的是将随机选择的元素与数组的最后一个元素交换。除此之外,您还需要将数组中 有效 元素的计数存储在变量 array_size_valid 中,并在每次交换发生时递减该值。

    这样你的随机索引生成函数就会变成:

    rand_index = rand () % array_size_valid;

    【讨论】:

      【解决方案2】:

      这是一个简单的方法:假设你有一个数组,包含 52 个整数:

      int deck[52];
      

      并且你已经将它初始化为你想要的值,比如1、1、1、1、2、2、2、2、.....

      抽卡时,将对应的数组元素设置为-1(或除原始值之外的任何值):

      int drawCard(int deck[])
      {
          do{
              int randIndex = rand () % 52;
          } while(deck[randIndex] == -1);
      
          int drawnCard = deck[randIndex];
          deck[randIndex] = -1;
          return drawnCard;
      }
      

      虽然这种方法可能不够高效,但它确实有效,所以我认为它可能对像你这样的初学者有所帮助。

      【讨论】:

      • @jojobuddy13 如果您认为它可以解决您的问题,请接受此答案:)
      • 这有可能进入无限循环。
      • @AnmolSinghJaggi 是的,这在理论上是可能的,但这种情况在实践中不会发生。现代 CPU 每秒可以运行数百万次循环。
      【解决方案3】:

      您可以使用改组算法,例如:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle。 Fisher - Yates shuffle 从一个数组开始,然后用数组中的一个随机项切换数组的每个项。也可以一个一个地删除项目,但是比较复杂。您可以使用二叉树随机删除项目。存储每个节点下的项目总数。每次,要删除一个项目,生成一个大于等于 0 且小于剩余项目数的随机数。从根开始。如果 a 小于左孩子下的项目数,则转到左孩子。否则,让 a 成为 a-,然后去找正确的孩子。递归执行此操作。但是一个一个地删除项目要复杂得多。最好只使用洗牌算法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-15
        • 2015-08-24
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        相关资源
        最近更新 更多