gpt4 book ai didi

c - 在c中随时间生成简单的随机数

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:32 25 4
gpt4 key购买 nike

我正在使用这个功能:

int rand2(int lim)
{
static long a = 1; // could be made the seed value
a = (a * 32719 + 3) % 32749;
return ((a % lim) + 1);
}

得到一堆随机数,它工作正常但每次我启动这个函数我都会有相同的堆栈数,所以我想使用 time() 系统函数每次都有不同的堆栈

int rand3(int lim, int dat_time)
{
static int a = dat_time; // could be made the seed value
a = (a * 32719 + 3) % 32749;
return ((a % lim) + 1);
}

然后我给了一次我电脑的 time() 因为变量 a 是静态的

int             main()
{
int rd;
time_t timee;
int seed;

timee = 0;
timee = time(timee);
seed = timee;
while(42)
{
rd = rand3(52, seed);
printf("%d\n", rd);
getchar();
}
}

然后我得到一个错误说 dat_time 不是一个常量,但是因为我用过一次我不明白为什么

最佳答案

静态存储持续时间变量在任何代码开始运行之前进行初始化,并且必须使用可在编译 时计算的表达式进行初始化。

这意味着不使用直到运行时才能确定的变量来初始化它们。如果您删除了 static,错误将消失,但您将在每次调用它时重新播种随机数生成器。

你确实应该在请求第一个随机数之前初始化随机种子一次(如 C 标准库中的 srand()/rand()),并且然后使用您的随机函数循环遍历序列中的值。这可以通过类似的方式完成:

int rand4 (int numLimit) {
static int randSeed, needsInit = 1;
if (needsInit) { // This bit only done once.
randSeed = time(0);
needsInit = 0;
}
randSeed = (randSeed * 32719 + 3) % 32749;
return (randSeed % numLimit) + 1;
}

A typical implementation srand()/rand() 的代码如下:

// RAND_MAX assumed to be 32767.
static unsigned long int next = 1;
void srand(unsigned int seed) { next = seed; }
int rand(void) {
next = next * 1103515245 + 12345;
return (unsigned int)(next/65536) % 32768;
}

在它自己的源文件中,以便隐藏 next 种子。这符合预期的行为,即调用 rand() 而不首先调用 srand() 与调用 srand (1) 相同。


而且,根据您的评论,您需要一定数量的调用才能生成从 1 到 52 的所有数字,听起来您正在使用它来生成一副随机纸牌。如果是这种情况,有一种比生成随机数并丢弃您已经看到的随机数更好的方法。

随着剩余甲板的尺寸越来越小,该解决方案会迅速恶化。对于 O(1) 时间和空间解决方案,请使用 Fisher-Yates 洗牌。

基本算法是使用未排序的列表,并简单地将最后一个元素与随机选择的元素交换,将列表大小减一:

dim n[N]                  // gives n[0] through n[N-1]

for each i in 0..N-1: // initialise them to their indexes
n[i] = i // (use i+1 for 1-10 instead of 0-9).

nsize = N // starting pool size
do N times:
i = rnd(nsize) // give a number between 0 and nsize-1
print n[i]
nsize = nsize - 1 // these two lines effectively remove the used number
n[i] = n[nsize]

由此产生的数字是:

<------ n[] ------>
0 1 2 3 4 5 6 7 8 9 nsize rnd(nsize) output
------------------- ----- ---------- ------
0 1 2 3 4 5 6 7 8 9 10 4 4
0 1 2 3 9 5 6 7 8 9 7 7
0 1 2 3 9 5 6 8 8 2 2
0 1 8 3 9 5 6 7 6 6
0 1 8 3 9 5 6 0 0
5 1 8 3 9 5 2 8
5 1 9 3 4 1 1
5 3 9 3 0 5
9 3 2 1 3
9 1 0 9

关于c - 在c中随时间生成简单的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19133275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com