【问题标题】:Generating list of random numbers without duplication using C?使用C生成不重复的随机数列表?
【发布时间】:2012-01-19 17:19:43
【问题描述】:

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

【问题讨论】:

  • 您是说它在每次通话中生成相同的号码吗?或者只是偶尔会重复数字?如果是后者,我知道没有比跟踪您已经生成的数字并在生成唯一值时维护该信息更好的方法了。
  • @w00te:这与这里没有为随机数指定小的上限不完全相同的问题。
  • 是的,我意识到了这一点,但我认为这很有帮助。请注意,我没有投赞成票:)

标签: c++ c


【解决方案1】:

通常的方法是这样的:

  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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    请注意,数字是按升序生成的,但您可以在之后随机播放。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        你可以这样做:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-07-12
          • 2012-12-17
          • 2012-05-27
          • 1970-01-01
          • 1970-01-01
          • 2012-01-23
          相关资源
          最近更新 更多