我如何随机 select 数组中的一个元素?

how do i randomly select an element in an array?

所以我已经尝试这样做了很长一段时间,现在令人尴尬。首先这是我的(非常糟糕的)代码:

char firstInfection() {            
     char cities[] = {"aa", "bb", "cc", "dd", "ee", "ff"};            
     srand(time(NULL));            
     int randnum = rand() % 5;            
     char firstCity = cities[randnum];            
     return firstCity; 
}

我没有包括预处理器的东西,但我也使用了字符串、数学和时间(显然还有 stdio 和 stdlib)

此处出现第 2 行错误,表示:error: too many initializers for ‘char []’ 我不太确定这里发生了什么。

我无法理解我需要做的一些事情。我在 tutorialspoint 上被告知我必须用第 3 行初始化随机:srand(time(NULL)) 我不知道为什么哈哈。

我尝试缩短 cities[]

中元素的名称

我不太确定还能尝试什么。我猜整件事是完全错误的,但我真的不知道。

#include <stdio.h>

const char* firstInfection() {            
     static const char* cities[] = {"aa", "bb", "cc", "dd", "ee", "ff"};            
     srand(time(NULL));            
     int randnum = rand() % 6;  // Select value 0 to 5 (inclusive)            
     const char* firstCity = cities[randnum];            
     return firstCity; 
}

int main(void) {
    
    printf("Random String: %s\n", firstInfection());
    return 0;
}

给出的答案并不好,因为 he/she 在一个函数内部调用了 srand() 函数,而不是 main()注意:srand() 只能在 main() 函数内的任何程序中调用一次。

一些改进:

  • 而不是使用裸 return 0;,使用 return EXIT_SUCCESS;,它在头文件 stdlib.h.
  • 中定义
  • 数据类型char表示用单引号括起来的单个字符'',使用char *c-string)存储多个字符
  • 始终使用 size_t 来存储任何数组的索引,而不是 int
  • Only C 如果你的函数没有接受任何参数,那么这样写 int func(void) { },这里是 why.
  • 不使用裸 rand() % 5,而是使用 sizeof() 运算符
  • 获取存储在堆栈内存中的数组的大小
  • 将您的局部变量 cities 标记为 static 因为您也将返回它。
  • 您的函数 firstInfection() 应使用 static 链接声明。
  • 您正在调用 time.h 头文件中声明的 time() 函数,因此也包含该头文件

最终代码:

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

static const char *firstInfection(void)
{
    static const char *cities[] = {"aa", "bb", "cc", "dd", "ee", "ff"};
    size_t rnd_index = rand() % (sizeof(cities) / sizeof(*cities));
    return cities[rnd_index];
}

int main(void)
{
    srand(time(NULL));
    printf("%s\n", firstInfection());
    return EXIT_SUCCESS;
}

输出:

[tushar@tushar-arch Desktop]$ ./main
aa
[tushar@tushar-arch Desktop]$ ./main
ee
[tushar@tushar-arch Desktop]$ ./main
cc