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

时间:2012-01-19 17:19:44

标签: c++ c

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

5 个答案:

答案 0 :(得分:8)

通常的做法是:

  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

答案 1 :(得分:0)

我假设您使用数组存储数字,您可以使用this inArray()函数之类的函数,并将其与do ... while循环一起使用,这将生成一个随机数,直到它生成一个不在数组

中的数字

编辑: w00te的评论链接指向this,我相信这比我的方法更好,绝对值得一读。这也是David Gelhar简要建议的内容。

答案 2 :(得分:0)

当限制很高并且您只想生成一些随机数时,此方法适用。

#!/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";
}

请注意,这些数字是按升序生成的,但您可以随后进行随机播放。

答案 3 :(得分:-1)

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

答案 4 :(得分:-1)

你可以这样做:

#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);
    }
}

你需要执行此操作,但它可以正常工作。