所以我要做的就是从用户那里获取要使用多少张卡的输入,然后将每张卡随机分配到阵列中的不同索引。我有很多问题让rand函数正常工作。我已经做了足够的阅读,以找到在数组中混洗元素的多种不同方法,以便在避免重复方面找到最简单的方法。我正在使用GCC,在我输入卡的数量之后,我从来没有从数组中获取值,如果我这样做,它们都是非常大的数字。任何帮助将不胜感激。
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
void main(){
srand(time(NULL));
int d, c, i, z, l, r;
printf("Enter the deck length: ");
scanf("%d\n ", &c);
int deck[c];
int swap[c];
z = c;
for(l=0; l<c; l++){
swap[l] = l;
}
for(i=z; i=0; i--){
r = rand() / i
deck[i] = swap[r];
for(r; r=(c-1); r++){
swap[r] = swap[(r+1)];
}
}
for(d = 0; d < c; d++){
printf("%d ", deck[d]);
}
return;
}
答案 0 :(得分:0)
我可以在这里发现一个主要问题:
for(i=z; i=0; i--)
^^^
此循环永远不会执行,因为您使用了分配(=
)并将i
设置为0
因此条件将始终为 false ,尽管使用在这种情况下,平等(==
)仍然是 false ,你可能想要:
for(i=z; i!=0; i--)
这意味着您将使用deck
单位化undefined behavior。一旦你修好了,你就会遇到类似的问题:
for(r; r=(c-1); r++){
main
必须返回int
,最后您的return
需要提供值。
启用警告应该可以让您找到大部分问题,例如使用-Wall
并gcc
为for
循环提供以下警告:
警告:建议用作真值的赋值括号[-Whatarentheses]
注意,有关如何正确使用rand
的指导,请参阅How can I get random integers in a certain range?。
答案 1 :(得分:-2)
你基本上需要能够伪随机生成52个数字而不重复。这是一种方法......
首先,使用一种方法循环一个随机数生成器52次,以确保没有随机数字重复。除main()之外的两个函数将有助于实现此目的:
#include <ansi_c.h>
int NotUsedRecently (int number);
int randomGenerator(int min, int max);
int main(void)
{
int i;
for(i=0;i<52;i++)
{
printf("Card %d :%d\n",i+1, randomGenerator(1, 52));
}
getchar();
return 0;
}
int randomGenerator(int min, int max)
{
int random=0, trying=0;
trying = 1;
while(trying)
{
srand(clock());
random = (rand()/32767.0)*(max+1);
((random >= min)&&(NotUsedRecently(random))) ? (trying = 0) : (trying = 1);
}
return random;
}
int NotUsedRecently (int number)
{
static int recent[1000];//make sure this index is at least > the number of values in array you are trying to fill
int i,j;
int notUsed = 1;
for(i=0;i<(sizeof(recent)/sizeof(recent[0]));i++) (number != recent[i]) ? (notUsed==notUsed) : (notUsed=0, i=(sizeof(recent)/sizeof(recent[0])));
if(notUsed)
{
for(j=(sizeof(recent)/sizeof(recent[0]));j>1;j--)
{
recent[j-1] = recent[j-2];
}
recent[j-1] = number;
}
return notUsed;
}