C 如何在不使用时间函数、静态变量或全局变量的情况下编写随机生成器函数?

C 如何在不使用时间函数、静态变量或全局变量的情况下编写随机生成器函数?,c,random,C,Random,如何在不使用时间函数、静态变量或全局变量等标准C函数的情况下编写随机生成器函数 /* #include <time.h> Don't use time functions. */ /* int seed = 1234; Don't use global variables. */ int generate_random(void) { /* static int seed = 1234; Don't use static variables. */ /* return

如何在不使用时间函数、静态变量或全局变量等标准C函数的情况下编写随机生成器函数

/* #include <time.h> Don't use time functions. */
/* int seed = 1234; Don't use global variables. */
int generate_random(void)
{
    /* static int seed = 1234; Don't use static variables. */
    /* return (time() % 100); Don't use time functions. */
}
/*#包含不使用时间函数*/
/*int seed=1234;不要使用全局变量*/
int生成_随机(无效)
{
/*static int seed=1234;不要使用静态变量*/
/*返回(time()%100);不使用时间函数*/
}
换句话说,此
随机生成器函数不应记住上一个状态。

是否执行

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

srand(time(NULL));
int r = rand();

不要试图创建自己的随机函数。它不会很好地结束

您也可以通过

#include<stdlib.h>

srand(getpid());

int num = rand();
#包括
srand(getpid());
int num=rand();

猜猜你的问题……我必须问一下想要一个随机种子的要求是什么

能够设置种子值对代码来说是一个加号,因为您至少可以尝试做回归测试之类的事情

如果你的问题是关于一般的随机数。生成一系列随机数需要两个步骤

首先,设置种子值,例如,
srand(1234)其中1234是种子值。您的代码只发出此指令一次。当您第二次运行程序时,您的代码可以重复使用相同的种子值,在这种情况下,随机数的序列将是相同的。如果设置不同的种子,则会得到不同的随机数序列

第二步是检索代码中使用的随机数值

一种可能的方法

理论上,您可以使用一个固定的种子值,然后生成R个随机数,其中R是
从系统中获取的某个数
mod 100(例如)。然后使用第R个随机数作为应用程序的实际随机数序列的种子值

您说您不想使用
Time()
,但是在这个随机数的双序列中,
Time()mod n
函数将提供足够的随机性


现在,我在理论上说,因为来自
rand()
的随机数实际上是伪随机的,而且出于所有的意图和目的,它们确实是随机的(有数学博士学位的人这么说…),所以我怀疑这样做是否会使数字更随机。但是,这种方法或类似的方法可能会让评论员或老板感到更舒服,但这是一种错误的安全感。

假设您需要自己制作伪随机数生成器, 你需要记住国家

如果函数不应该记住最后一个状态,则需要将其作为参数传递:

int generate_random(int * lastState)
{
    // generate next random from lastState
    // store state to lastState
    // return result
}

int main(void)
{
    int lastState = 1234; // seed it
    int random = generate_random(&lastState);
}

此解决方案符合您的所有标准,但它确实需要互联网。*

*不过,这并不是反对该算法的标志,因为互联网是一个很好的随机数据源<代码>;-)


你必须设计一个,然后试着写……这里:我已经建议了一些有用的源代码来编写随机函数。目标是什么?如果它是真正随机的,它应该基于硬件噪声发生器。在某些操作系统上,有一个设备可以收集可以使用的随机数据……您需要使用/dev/random如果您正在编写函数,而它不会记住任何状态,那么您的函数必须能够从一个好的随机源获取随机数据。在支持这些功能的系统上,标准位置是
/dev/random
/dev/urandom
。或者,您需要一个自定义设备为您生成随机数。如果要生成自己的伪随机数据,则需要全局或静态变量来存储先前的状态。如果练习的目的是避免全局状态,则srand/rand将不起作用,因为它们在内部使用全局状态。
int generate_random(int * lastState)
{
    // generate next random from lastState
    // store state to lastState
    // return result
}

int main(void)
{
    int lastState = 1234; // seed it
    int random = generate_random(&lastState);
}
unsigned generate_random () {
    FILE *random;
    char cmd[512];
    unsigned number;

    snprintf(cmd, sizeof(cmd),
         "wget -qO - "
         "'http://www.random.org/integers/"
         "?num=1&min=0&max=%u&col=1&base=10&format=plain&rnd=new'",
         USHRT_MAX);

    random = popen(cmd, "r");
    fscanf(random, "%u", &number);
    pclose(random);

    return number;
}