C 如何在不使用时间函数、静态变量或全局变量的情况下编写随机生成器函数?
如何在不使用时间函数、静态变量或全局变量等标准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
/* #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;
}