具有不同输出的随机数

时间:2013-11-26 10:19:44

标签: c++ random shuffle

我试图随机输出20个不同的数字,但它仍包含相同的数字。 这是代码:

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

void main(){
    int arr[20];
    srand(time(NULL));
    int temp;

    temp=rand()%20;

    int x=0;



      while(x<20)
      {
          if(x==0)
          {
              arr[x]=temp;
              x++;
          }
          else
          {
                  for(int j=1;j<=x;j++)
                  {
                     do
                      {
                          temp=rand()%20;  
                      } while(temp==arr[x-j]);
                  }
                  arr[x]=temp;
                  x++;
           }
      }

      for(int i=0;i<20;i++)
        {
        printf("%d. %d \n",i,arr[i]);
        }



}

这是输出:

  
      
  1. 10
  2.   
  3. 1
  4.   
  5. 6
  6.   
  7. 2&lt; - 重复
  8.   
  9. 13
  10.   
  11. 19
  12.   
  13. 2&lt; -
  14.   
  15. 19
  16.   
  17. 4
  18.   
  19. 19
  20.   
  21. 14
  22.   
  23. 18
  24.   
  25. 12
  26.   
  27. 2&lt; -
  28.   
  29. 17
  30.   
  31. 15
  32.   
  33. 0
  34.   
  35. 1
  36.   
  37. 18
  38.   
  39. 8
  40.   

提前致谢:D

5 个答案:

答案 0 :(得分:3)

#include <vector>
#include <algorithm>
...
vector<int> vec;
for (int i=0; i < 20; ++i) vec.push_back(i);

random_shuffle(vec.begin(), vec.end());

答案 1 :(得分:0)

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

void main(){
    int arr[20];
    srand(time(NULL));
    int temp;

    temp=rand()%20;

    int x=0;

    while(x<20)
    {
          if(x==0)
          {
              arr[x]=temp;
              x++;
          }
          else
          {
              int j;
              do
              {
                  temp=rand()%20;
                  for(j=0;j<x;j++)
                  {
                      if ( temp==arr[j] ) break;
                  }
              } while ( j < x );
              arr[x]=temp;
              x++;
           }
     }

     for(int i=0;i<20;i++)
       {
       printf("%d. %d \n",i,arr[i]);
       }

}

答案 2 :(得分:0)

想想你的循环

for(int j=1;j<=x;j++)
{
     do
     {
          temp=rand()%20;  
     }while(temp==arr[x-j]);
}

以x = 8时的位置为例。这将循环通过j = 1到j = 7。它将继续生成一个数字,直到它与正在检查数组的当前数字不同,直到达到数组的开始。但是,请考虑何时达到j = 7。生成新数字时,它可能与数组中的第一个元素不同,因此将退出do-while循环;但是,它可能仍然与数组中的其他数字相同?

您需要(对于每个元素):生成一个随机数。检查它是否与数组中的任何数字都不匹配。如果它再次启动,如果它没有设置阵列号并继续。

答案 3 :(得分:0)

您可以准备std::vector在您所需的范围内存储唯一号码,然后使用std::shuffle()对其进行随机播放。

请注意rand() is considered harmful,因此您可能希望使用更好的伪随机数生成器,例如Marsenne Twister引擎std::mt19937

Compilable评论代码如下:

#include <algorithm>    // for std::shuffle
#include <iostream>     // for std::cout
#include <random>       // for std::mt19937, std::random_device
#include <vector>       // for std::vector
using namespace std;

vector<int> PrepareUniqueRandomNumbers(const int count) 
{
    // Prepare the vector with unique numbers 0,1,2,...,(count-1)
    vector<int> numbers;
    numbers.reserve(count);
    for (int i = 0; i < count; ++i)
        numbers.push_back(i);    

    // Use Mersenne Twister engine as pseudo-random number generator
    random_device rd;
    mt19937 prng(rd());

    // Shuffle the vector, so the numbers
    // appear in a (pseudo-)random order.
    shuffle(numbers.begin(), numbers.end(), prng); 

    return numbers;
}

int main() 
{
    const auto numbers = PrepareUniqueRandomNumbers(20);
    for (auto x : numbers)
        cout << x << '\n';     
}

答案 4 :(得分:0)

如果您已经知道只存储20个数字,则无需使用矢量。 rand()函数已经过时,并不是很好的C ++风格。您也不需要Mersenne-Twister作为您的意图的引擎,这绝对没有必要。

#include <array>
#include <random>
#include <algorithm>

int main()
{
    std::array<int, 20> randomNumbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20};
    std::random_device randomDevice;
    std::default_random_engine engine(randomDevice());
    std::shuffle(randomNumbers.begin(), randomNumbers.end(), engine);
}