使用C生成不重复的随机数列表

Generating list of random numbers without duplication using C?

本文关键字:随机数 列表 使用      更新时间:2023-10-16

我正在制作一个益智游戏,我想生成一个介于某个极限之间的随机数列表。我已经使用了rand和srand函数,但它也给了我重复的值。我想生成一个没有重复的随机列表,我该怎么做?

通常的方法类似于:

  populate an array source_array of size <n> with numbers from 0 to n-1
  while n > 0
  use rand to generate a random number x in the range 0..n-1
  add source_array[x] to the result list
  source_array[x] = source_array[n-1]; // replace number just used with last value
  --n; // next time, one less number

我假设您使用的是一个数组来存储数字,您可以使用类似于inArray()函数的东西,并将其与do ... while循环一起使用,该循环将生成一个随机数,直到它生成一个不在数组中的数

编辑:w00te的评论链接到这个答案,我认为这个答案比我的方法更好,绝对值得一读。这也是David Gelhar的简短建议。

当限制很高时,并且您只想生成几个随机数时,此方法的结果是合适的。

#!/usr/bin/perl
($top, $n) = @ARGV; # generate $n integer numbers in [0, $top)
$last = -1;
for $i (0 .. $n-1) {
    $range = $top - $n + $i - $last;
    $r = 1 - rand(1.0)**(1 / ($n - $i));
    $last += int($r * $range + 1);
    print "$last ($r)n";
}

请注意,这些数字是按升序生成的,但之后可以进行混洗。

为了避免重复,您可以将所有生成的数字存储在一个列表中,在每次迭代时,检查该数字是否已经生成;如果是,则重新生成,如果不是,则将其添加到列表中并显示。

您可以这样做:

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUMBER_VALUE 60
#define HOW_MANY_NUMBERS 10
int main ( void )
{
    int numbers[HOW_MANY_NUMBERS];
    int counter = 0;
    while ( counter < HOW_MANY_NUMBERS)
    {
        int tempRandom = rand ( MAX_NUMBER_VALUE + 1 );
        int check = 0;
        while ( check <= counter )
        {
            if ( number[counter] == number[check] )
                tempRandom = rand ( MAX_NUMBER_VALUE + 1 );
        }
        printf("Random number #%d - Value: %d", counter, tempRandom);
    }
}

你需要执行此操作,但它有效。