预设列表中的随机数

时间:2016-03-29 02:22:45

标签: c arrays list random

我是一名学生,正处于中期项目的中间。我不是在找人为我编码,但我需要帮助。我正在尝试制作一个二十一点游戏并且这样做我想设置一个52个整数的列表[1,1,1,1,2,2,2,2 .....]一个卡片中的每张卡片。但如何从列表中取一个随机数并取消它?就像普通牌一样,一旦拿到牌,你就不能重新绘制它。我知道可以为程序设置一个随机参数[n = rand()%11 + 1]但是我想要超越它来获得A

3 个答案:

答案 0 :(得分:1)

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

这样你的随机索引生成功能就会变成:

rand_index = rand () % array_size_valid;

答案 1 :(得分:1)

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

int deck[52];

并且您已将其初始化为您想要的值,例如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;
}

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

答案 2 :(得分:-1)

您可以使用混洗算法,如下所示:https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle。 Fisher-Yates shuffle以一个数组开始,然后用数组中的随机项切换数组的每个项目。也可以逐个删除项目,但它更复杂。您可以使用二叉树随机删除项目。存储每个节点下的项目总数。每次要删除一个项目,都会生成一个大于或等于0且小于剩余项目数的随机数。从root开始。如果a小于左子项下的项目数,则转到左侧子项。否则,让a-,并找到合适的孩子。递归地这样做。但是逐个删除项目会更复杂。最好只使用一个改组算法。