考虑到每个值都具有唯一的对应值,如何在数组中随机显示值?

时间:2011-11-07 05:33:54

标签: c arrays loops random

使用C,如何在数组中随机显示值,考虑到这些值中的每一个都具有唯一的对应值而不重复显示任何这些值? 使用C,我的目标是一次一个地随机显示问题,进行一定量的迭代。我创建了一个包含问题及其四个可能答案的数组。我还创建了一个数组,其中包含每个问题的正确答案。

非常感谢...你们真的很有帮助

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h> 

int random();
int l, qs[10];
int main ()
{
for (l=0;l<10;++l)
qs[l]=0;
srand(time(NULL));
char questions [] [50]  ={"aa \n\na)\n\nb)\n\nc)\n\nd)",\"bb   \n\na)\n\nb)\n\nc)\n\nd)", "cc \n\na)\n\nb)\n\nc)\n\nd)", \
"dd \n\na)\n\nb)\n\nc)\n\nd)", "ee \n\na)\n\nb)\n\nc)\n\nd)", \
"ff \n\na)\n\nb)\n\nc)\n\nd)", "gg \n\na)\n\nb)\n\nc)\n\nd)", \
"hh \n\na)\n\nb)\n\nc)\n\nd)", "ii \n\na)\n\nb)\n\nc)\n\nd)", \
"jj \n\na)\n\nb)\n\nc)\n\nd)"};
char answers [10] = {'a','b', 'b','d','c','b','d','b' ,'c', 'b'};
int i, j;
char ans;
int score = 0;
printf ("Read each question carefully and choose your best answer.");
for (i=1;i<6;i++)
{
j = random();
fflush(stdin);
clrscr();
printf ("\n %d %s \n\n", i, questions [j]);
printf ("\n Enter Answer: ");
do
{
ans = tolower(getchar());
}while ( (ans < 'a') || (ans > 'd'));
printf ("\nYou chose: %c ", ans);
if (ans == answers[j])
{score = score + 1;
printf ("\n\nCorrect. %d Mark/s", score);
}else{printf ("\n\nIncorrect. 0 Mark/s");}
printf("\n\nPress Enter for next question...");
getch ();
}
getch ();
return 0;
}
random ()
{
int k;
do
{k=rand()%10;
}while (qs[k]!=0);
qs[k]= 1;
return k;
}

2 个答案:

答案 0 :(得分:1)

首先,我要改变你安排数据的方式。现在,你有三个并行数组,一个用于问题,一个用于潜在答案,另一个用于正确答案。

而不是那样,我会创建一个结构来保存单个问题的所有数据,如下所示:

struct qa { 
    char question[64];
    char answers[4][32];
    int correct_answer;
};

然后我会创建一个qa结构数组,每个结构包含一个问题和答案的所有数据:

qa questions[] = {
    { "what color is the sky?", { "red", "green", "blue", "yellow"}, 2},
    { "When is Christmas?", {"January", "July", "September", "December"}, 3},
    // ...
};

从那里,你有几个选择。如果您要询问所有(或几乎)所有问题,并且主要想要改变订单,您可以使用Fisher-Yates洗牌,如@Salvatore Previti建议的那样。

如果您在任何特定时间仅询问一小部分问题,那可能会非常浪费。在这种情况下,您可以使用(例如)Robert Floyd发明的选择算法,我在previous answer中讨论过。

答案 1 :(得分:0)

您需要另一个列表来跟踪您提取的项目。

一种可能的解决方案:随机输入数组。见http://benpfaff.org/writings/clc/shuffle.html

如果无法修改输入数组,则可以使用索引,即间接级别。 这是另一种可能的解决方案。

1)创建一个大小为n的整数数组。

2)用0到n-1(包括)的值填充数组。

3)你改组数组(寻找一个随机化数组的shuffle方法),例如,再次http://benpfaff.org/writings/clc/shuffle.html

4)然后,您将数组从0迭代到n-1(包含),数组中的每个项目都将是源数组中的索引。

完成。

另一种可能的解决方案是使用链表。

1)你以随机顺序填写链表(这很容易)。

在伪代码中,例如

for (int i = 0; i < n; ++i)
{
    if (rand() & 1)
        insert_at_the_beginning();
    else
        insert_at_the_end();
}

2)当您需要新项目时,可以弹出链接列表中的第一项。

完成。

你也可以保留一个布尔值数组,但在这种情况下算法的复杂性会更高,第一种方法似乎就足够了。