首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用C++实现random.choice

如何用C++实现random.choice
EN

Stack Overflow用户
提问于 2020-06-18 15:49:30
回答 2查看 1.9K关注 0票数 0

作为一名Python中级学习者,我在Python中打出了8个球。现在我开始学习C语言了,有没有一种方法可以模拟random.choice从字符串列表中选择字符串的方式,但用的是C语言?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-18 17:28:23

在C中,最接近“字符串列表”的东西是一个字符串指针数组;而产生随机数的唯一标准库函数是在<stdlib.h>中定义的rand()

一个简单的例子:

代码语言:javascript
运行
复制
#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是从0N-1的数字。

阿空加瓜指出,这并不理想。如果N不能均匀地划分RAND_MAX,那么就会倾向于更小的数字。不过,现在还可以,但是如果您要进行认真的模拟或统计工作,则计划稍后学习一些其他方法;如果您真的做到了这一点,那么您可能无论如何都不会使用内置的rand()函数。

票数 3
EN

Stack Overflow用户

发布于 2020-06-18 15:59:44

如果知道数组的大小,您可以编写一个函数,并使用rand() % size从数组中获取随机索引。然后返回arr[randidx]的值

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62444974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档