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

时间:2013-08-22 06:18:40

标签: 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 (time() % 100); Don't use time functions. */
}

换句话说,这个random generator function不应该记住最后一个状态。

5 个答案:

答案 0 :(得分:2)

你也可以使用srand by

#include<stdlib.h>

srand(getpid());

int num = rand();

答案 1 :(得分:1)

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

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;
}
  

* 然而,这并不是对算法的真正标记,因为互联网是随机数据的绝佳来源。 ;-)

答案 2 :(得分:0)

假设你需要做你自己的伪随机数发生器, 你需要记住这个状态。

如果函数不记得上一个状态,则需要将其作为参数传递:

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);
}

答案 3 :(得分:-1)

DO

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

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

如果你想限制使用次数

int r = minNum + rand() % maxNum;

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

答案 4 :(得分:-1)

猜测你的问题......我不得不问想要一个随机种子的要求是什么?

能够设置种子值是代码的一个优点,因为你至少尝试做回归测试等事情。

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

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

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

一种可能的方法

理论上,您可以使用固定的种子值然后生成R随机数,其中R是some number taken from the system mod 100(例如)。然后使用该R'th随机数作为应用程序的实际随机数序列的种子值。

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

现在,我在理论上说,因为来自rand()的随机数实际上是伪随机的,并且出于所有意图和目的,它们实际上是随机的(有数学博士的人说这个...),所以我怀疑是否这样做“双重选择”将使数字更随机。但是,这种方法或类似方法可能会让审稿人或老板觉得更舒服,但这会是一种虚假的安全感。