我目前正在为我在C编程中的最终项目进行二十一点游戏。我有一个有效的基本程序,但我想让它更有吸引力,因为我有时间。我正试图让我的#34;从牌组中抽出一张牌"该计划的一部分比1 + rand() % 11
两次更有趣,以拉两张牌。
我想拥有一组数字并从中提取一个随机数。 (简单)但是从来没有绘制相同的数字,在这种情况下,超过4次。要做到这一点,我想获得1到52之间的随机数,以获得"卡的位置标记"在数组中,并移动" card"到甲板的后面并减少你可以得到一个随机数的数量(e.x 1-51循环1-50循环1-49)
我认为我的错误是冒泡,但我可能错了。
int main(){
int deck[52] = {1,1,1,1,2,2,2,2,3,3,3,3,4,
4,4,4,5,5,5,5,6,6,6,6,7,7, //Array of cards
7,7,8,8,8,8,9,9,9,9,10,10,
10,10,10,10,10,10,10,10,10,
10,11,11,11,11};
for(i=51;i>0;--i){
//for loop to decrease value of i
srand(time(NULL));
crd = rand() % i; //the number - 1 every loop that becomces "crd"
printf("%d\n",deck[crd]);
deck[i+1] = temp; //bouble sort the card to the back of the deck
deck[crd] = deck[i+1];
deck[crd] = temp;
}
}
我的出局如下 10 6 1 9 6 4 3 0 0 0 0 0 8 五 3 0 4 7 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 3 2 0 0 1 0 0 0 2 0 0 0 0
我的程序崩溃了。我无法确定代码有什么问题。请帮忙
答案 0 :(得分:1)
您尝试模拟的算法是现代Fisher Yates shuffle
-- To shuffle an array a of n elements (indices 0..n-1):
for i from n−1 downto 1 do
j ← random integer such that 0 ≤ j ≤ i
exchange a[j] and a[i]
这段代码是你的清理了一下。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static int deck[52] = {
1 ,1 ,1 ,1 ,2 ,2 ,2 ,2 ,3 ,3 ,3 ,3 ,4 ,
4 ,4 ,4 ,5 ,5 ,5 ,5 ,6 ,6 ,6 ,6 ,7 ,7 ,
7 ,7 ,8 ,8 ,8 ,8 ,9 ,9 ,9 ,9 ,10,10,10,
10,10,10,10,10,10,10,10,10,11,11,11,11
};
void swap (int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int main(void) {
//You only need to call srand once.
srand(time(NULL));
int i = 0;
int j = 0;
for(i = 51 ; i > 0; --i){
j = rand() % i;
printf("%d\n",deck[j]);
swap(&deck[j], &deck[i]);
}
return 0;
}
这里重要的一点是i
在整个数字范围内正在减少,即每个数字将与随机选择的数字交换。
答案 1 :(得分:0)
一些问题:
srand
once。for
循环将在循环的第一次迭代(i == 51
和deck[i+1]
)之外访问数组外部,并且永远不会触及元素0
(最后一个元素)应该是1
)。您可以将for (i = 51; i > 0; --i)
更改为for (i = 50; i >= 0; --i)
。deck[i+1] = temp;
应为temp = deck[i+1];
。交换通常如下所示:
// to swap a and b
int t;
t = a;
a = b;
b = t;
这不是一个“语法”,而是一个如何交换两个变量的约定。例如,惯用交换在Python中看起来像a, b = b, a
。