【问题标题】:how to print 5 unique strings from array of 10 strings如何从 10 个字符串的数组中打印 5 个唯一字符串
【发布时间】:2014-08-23 13:55:46
【问题描述】:

我正在编写一个代码,它将从 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);

    }
}

【问题讨论】:

  • 您可以保留使用过的号码的历史记录,并检查抽出的号码是否已经出现在历史记录中。

标签: c arrays random srand


【解决方案1】:

只要记住已经打印出来的 idice:

#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;
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:
        #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;
        }
        

        【讨论】:

        • 这如何解决问题?它看起来像 OP 发布的内容,除了您添加了缺少的标题。
        猜你喜欢
        • 2017-11-23
        • 1970-01-01
        • 2022-12-20
        • 2017-04-15
        • 1970-01-01
        • 2017-06-25
        • 1970-01-01
        • 2013-04-18
        • 1970-01-01
        相关资源
        最近更新 更多