如何从10个字符串的数组中打印5个唯一的字符串

时间:2014-08-23 13:55:46

标签: c arrays random srand

我正在编写一个代码,它将从10个字符串的数组中打印5个唯一且随机的字符串。但是我的代码不能独特地打印它,总会有一些重复。 这是我的代码,任何人都可以建议如何使其打印独特?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>




void main(void){
    char arr[10][10]={"abc","def","ghi","klm","nop","qrs","tuv","wxy","zab","cde"};
    int i=0,j=0;

    srand(time(0));

    for(i=0;i<5;i++){

    j=rand()%10;
    printf("%d\n",j);

    }
}

4 个答案:

答案 0 :(得分:2)

请记住已经打印过的错误:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    char arr[10][10] = {"abc","def","ghi","klm","nop","qrs","tuv","wxy","zab","cde"};
    int i = 0, j = 0;
    int done[10] = { 0 };

    srand(time(0));

    for (i = 0; i < 5; ++i)
    {
        do
        {
            j = rand()%10;
        }
        while (done[j] == 1);
        done[j] = 1;
        printf("%s\n", arr[j]);
    }

    return 0;
}

答案 1 :(得分:2)

您的rand()函数可能会多次评估相同的字符串索引。有不同的方法来解决这个问题。他们中的大多数将是位向量方法的起飞。您可以创建一个布尔数组并将其初始化为false。无论何时打印数字,您都可以将该索引的布尔数组中的元素更改为true。如果选择了某个元素,则可以检查布尔数组中是否已打印。如果是,您可以重新生成随机数,或移动到下一个未打印的元素,确保在打印该元素时相应的布尔条目更改为true

答案 2 :(得分:2)

你的随机函数给出重复,例如你的骰子在4次投掷中两次投出'3'。

你可以做些什么来简化它,创建一个数组[0..9], 让随机函数用[j]交换a [i]。

然后你得到一个随机的排列。获取置换数组的前5个元素。

答案 3 :(得分:1)

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include <time.h>

int main(){
    char arr[10][10]={"abc","def","ghi","klm","nop","qrs","tuv","wxy","zab","cde"};
    int found[10] = { 0 };
    int i = 0,j = 0;
    srand(time(NULL));
    for(i = 0; i < 5; i++){
        j = rand() % 10;
        while(1){               
            if(!found[j]) break;
            j = rand() % 10;
        }
        found[j] = 1;
        printf("%s\n", arr[j]);
    }
    return 0;
}