我如何随机 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
所以我已经尝试这样做了很长一段时间,现在令人尴尬。首先这是我的(非常糟糕的)代码:
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;
}
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