作为一名Python中级学习者,我在Python中打出了8个球。现在我开始学习C语言了,有没有一种方法可以模拟random.choice
从字符串列表中选择字符串的方式,但用的是C语言?
发布于 2020-06-18 17:28:23
在C中,最接近“字符串列表”的东西是一个字符串指针数组;而产生随机数的唯一标准库函数是在<stdlib.h>
中定义的rand()
。
一个简单的例子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h> // needed for the usual srand() initialization
int main(void)
{
const char *string_table[] = { // array of pointers to constant strings
"alpha",
"beta",
"gamma",
"delta",
"epsilon"
};
int table_size = 5; // This must match the number of entries above
srand(time(NULL)); // randomize the start value
for (int i = 1; i <= 10; ++i)
{
const char *rand_string = string_table[rand() % table_size];
printf("%2d. %s\n", i, rand_string);
}
return 0;
}
这将从一个由五个字符串组成的数组中生成并打印十个随机选项。
string_table
变量是一个const char *
指针数组。您应该始终使用常量指针来引用文字字符串,如"alpha"
。它可以防止您在字符串内容可能发生更改的上下文中使用该指针。
随机数是所谓的“伪随机数”;统计上不相关,但完全由起始的“种子”值确定。使用语句srand(time(NULL))
获取当前时间/日期值(从某个起始日期开始的秒数),并将其用作在任何计算机的生命周期中不会重复的种子。但是,如果您设法在同一秒内运行该程序两次,您将得到完全相同的“随机”数字。例如,这在shell脚本中很容易做到。一个更高分辨率的时间戳会更好,但是C标准库中没有任何有用的东西。
rand()
函数返回一个从0到某个依赖于实现的最大值之间的非负int值。符号常量RAND_MAX
具有该值。表达式rand() % N
将返回该值除以N的余数,N是从0
到N-1
的数字。
阿空加瓜指出,这并不理想。如果N不能均匀地划分RAND_MAX
,那么就会倾向于更小的数字。不过,现在还可以,但是如果您要进行认真的模拟或统计工作,则计划稍后学习一些其他方法;如果您真的做到了这一点,那么您可能无论如何都不会使用内置的rand()函数。
发布于 2020-06-18 15:59:44
如果知道数组的大小,您可以编写一个函数,并使用rand() % size
从数组中获取随机索引。然后返回arr[randidx]
的值
https://stackoverflow.com/questions/62444974
复制相似问题