首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rand函数的改进

Rand函数的改进
EN

Stack Overflow用户
提问于 2013-06-19 08:59:30
回答 4查看 163关注 0票数 2

我的代码初始化了一个指向随机名称的指针。随机名称是使用rand函数随机选择的。

我注意到rand函数并不能完全完成我想让它做的事情。在下面的代码中,它初始化所有具有相同名称的指针!我怀疑这与rand函数有关,它基于时间函数进行选择。如果它一次初始化所有指针,它将产生相同的随机数!?我相信时间戳产生另一个数字是需要时间的,对吧?我可以通过在循环中运行初始化来修复代码,但我想知道另一种修复方法,因为有时需要几秒钟来完成循环。

供参考:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>

int  random_number(int, int);
const char *random_name();
//----------------------------------------------------------------
int main(void)
{
    const char * kg = NULL;
    const char * ke = NULL;
    const char * dg = NULL;
    const char * de = NULL;

    kg = random_name();
    ke = random_name();
    dg = random_name();
    de = random_name();

    printf("kg=%s\nke=%s\ndg=%s\nde=%s\n", kg, ke, dg, de);

    return 0;
}
//----------------------------------------------------------------
const char *random_name(int x)
{
    const char *names[7] =
    {"Bob", "Billy", "Buck", "Bobby", "Bill", "Billy Bob", "Bobi"};

    int roll = random_number(0,7);
    return names[roll];
}
//----------------------------------------------------------------
int random_number(int min, int max)
{
    int roll;
    int maximum = max - min;
    srand(time(NULL));
    roll = (rand() % maximum) + min;
    return roll;
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-19 09:06:24

rand()函数是一个伪随机数生成器,它使用上一代数来计算下一个值。通过使用srand()进行播种,您可以设置起始值,如果您多次设置,则可以有效地“重置”随机数序列。在程序开始时,而不是在每次调用rand()之前,为随机数生成器设定一次种子(使用srand())。

票数 7
EN

Stack Overflow用户

发布于 2013-06-19 09:06:43

srand(time(NULL))移到您的main方法中。这为程序入口点的随机数生成器提供了种子,允许在每次调用rand()时从其余随机数中检索具有偶数分布的不同随机数。

票数 2
EN

Stack Overflow用户

发布于 2013-06-19 09:06:45

我认为问题存在于这样一个事实,即您在每次运行时都为PRNG的每个调用设定一个新值。看看srand() does here是什么。您希望避免在每次调用时都为PRNG设定种子的原因是,您不能保证在下一次调用rand()时生成的值是均匀分布的。您最可能寻找的是值的均匀分布,以这种方式使用srand()将产生意想不到的结果。This answer将提供更多关于为什么应该只调用一次srand()的详细信息。

还要记住,类似的规则将适用于任何语言的任何PRNG,而不仅仅是C。

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

https://stackoverflow.com/questions/17181353

复制
相关文章

相似问题

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