如何随机显示数组中的字符串字符

How to show characters of string in array randomly

我正在做我的大学项目,其中我希望用户猜测从字符串数组中随机显示的字符的单词,我实现了随机显示字符,但问题是有些字符重复,有些从不显示.

我试图创建一个数组来存储已显示字符的索引,然后检查它是否已经在数组中,但我卡在这里的程序不是我预期的 运行。

char arrWords[5][10] = { 
                                                    {"Hello"},
                                                    {"world"},
                                                };

// Seed random number generator
srand(time(NULL));

int i, j, k, r, index[5];

// for loop every word in array
for(i=0; i<=5; i++) {

    // for loop every character in i word
    for(j=0; j<=strlen(arrWords[i]); j++) {

        r = random(strlen(arrWords[i]));

        index[j] = r;

        for(k=0; k<=5; k++) {
            printf("%d ", index[k]);
        }           

    }

    printf("\n\n\n");

}

int random(int range){
    int num;
    num = rand() % range;
    return num;
}

我想显示 "hello" 喜欢 -> "elolh", "world" -> "dlorw"

您可以使用随机排列随机排列字符串:

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

int main(void)
{
    char text[] = "Hello world";
    int len = (int)strlen(text);
    int idx, num, tmp;

    srand((unsigned)time(NULL));
    for (idx = 0; idx < len; idx++)
    {
        num = rand() % len--;
        tmp = text[idx];
        text[idx] = text[num];
        text[num] = (char)tmp;
    }
    puts(text);
    return 0;
}

输出:

rl eowHoldl

您没有检查索引是否已经写入索引数组。试试下面的一个。

int lock;
 // for loop every word in array
for(i=0; i<=5; i++) {
    j=0;
    lock = 0;
    // for loop every character in i word
    while( j<=strlen(arrWords[i])) {

        r = random(strlen(arrWords[i]));
        for(k=0; k < j; k++)
        {
           if(index[k] == r)
              lock++;
        }
        if(lock == 0)
        {
           index[j] = r;
           j++;
        }
        lock = 0;         
    }

    for(k=0; k<=5; k++) {
        printf("%d ", index[k]);
    }  

    printf("\n\n\n");

}

以上代码改编自您的原始代码。然而,这是一种低效的方法,因为 while 循环等待直到随机函数 return 不可用索引。这就是为什么@David Ranieri 的方法更容易实现您想要做的事情。

要输出公平随机化,减少给random()

length
int length = strlen(arrWords[i]);
char rbuf[length + 1];   // VLA
strcpy(rbuf, arrWords[i]);

// for loop every character
while (length > 1) {
  int r = random(length);
  length--;
  // swap
  int t = rbuf[length];
  rbuf[length] = rbuf[r];
  rbuf[r] = t;
}

printf("%s", rbuf);