如何随机显示数组中的字符串字符
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);
我正在做我的大学项目,其中我希望用户猜测从字符串数组中随机显示的字符的单词,我实现了随机显示字符,但问题是有些字符重复,有些从不显示.
我试图创建一个数组来存储已显示字符的索引,然后检查它是否已经在数组中,但我卡在这里的程序不是我预期的 运行。
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);