gpt4 book ai didi

c - 在 C 中生成唯一的随机数

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

我尝试在 C 中生成 10 个唯一的随机数。我有一个包含 10 个数字的数组 numout[],但这会在一段时间后出现“段错误”。

代码是:

int i,j,numout[10],randnum;

void main()
{
srand(time(NULL));
for(i=0;i<10;i++)
{
numout[i]=generate();
printf("%d",numout[i]);
fflush(stdout);
sleep(1);
printf("\b");
}
}
int generate()
{
randnum=1+(int)(rand()*mul_val/(RAND_MAX+1.0));
for(j=0;j<i;j++)
{
if(randnum==0 || randnum==numout[j])
{
randnum=generate();
}
}
return(randnum);
}

最佳答案

认真地扔掉那些代码。您需要一个改组算法,而不是一段检查旧值是否重复的代码。随着您的池用完,按照您的方式进行操作最终会花费越来越长的时间。混洗算法的优点是它不会随着池变小而退化。

这是我在回答不同问题时使用的一段代码。它维护一个数字列表,当它向您返回一个随机数字时,它会将其从列表中删除并减少下一个随机选择的计数。

#include <stdio.h>
#include <stdlib.h>

#define ERR_NO_NUM -1
#define ERR_NO_MEM -2

int myRandom (int size) {
int i, n;
static int numNums = 0;
static int *numArr = NULL;

// Initialize with a specific size.

if (size >= 0) {
if (numArr != NULL)
free (numArr);
if ((numArr = malloc (sizeof(int) * size)) == NULL)
return ERR_NO_MEM;
for (i = 0; i < size; i++)
numArr[i] = i;
numNums = size;
}

// Error if no numbers left in pool.

if (numNums == 0)
return ERR_NO_NUM;

// Get random number from pool and remove it (rnd in this
// case returns a number between 0 and numNums-1 inclusive).

n = rand() % numNums;
i = numArr[n];
numArr[n] = numArr[numNums-1];
numNums--;
if (numNums == 0) {
free (numArr);
numArr = 0;
}

return i;
}

int main (void) {
int i;

srand (time (NULL));
i = myRandom (20);
while (i >= 0) {
printf ("Number = %3d\n", i);
i = myRandom (-1);
}
printf ("Final = %3d\n", i);
return 0;
}

示例输出显示了它的运行情况:

Number =  19
Number = 10
Number = 2
Number = 15
Number = 0
Number = 6
Number = 1
Number = 3
Number = 17
Number = 14
Number = 12
Number = 18
Number = 4
Number = 9
Number = 7
Number = 8
Number = 16
Number = 5
Number = 11
Number = 13
Final = -1

使用非负池大小调用它,它会设置一个新序列并返回第一个随机值。之后,您可以使用 -1 调用它,它将从池中获取下一个随机的唯一数字。当池耗尽时,它将返回 -1。

other answer如果您希望能够在线程代码中使用此功能,则包含此代码的版本也可以维护多个池。

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

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