如何在不使用时间函数,静态变量或全局变量等标准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
不应该记住最后一个状态。
答案 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()
的随机数实际上是伪随机的,并且出于所有意图和目的,它们实际上是随机的(有数学博士的人说这个...),所以我怀疑是否这样做“双重选择”将使数字更随机。但是,这种方法或类似方法可能会让审稿人或老板觉得更舒服,但这会是一种虚假的安全感。