列出小于10的不同随机整数

时间:2019-08-07 04:31:51

标签: c++ random

我想生成一个小于10的随机整数列表,它们不一样(不同的整数),例如(0,3,1,5,8)。 但是我编写的代码有问题,并且前两个整数始终相同。 如果您的代码告诉我代码的错误或为我提供另一种方法,那会很棒。

vector<int> rand_list(10, 11); //there is ten integers of 11   
for (int i = 0; i < 5; i++) // here we make 5 different integers
{
    srand(time(NULL));
    int r = rand() % 10;
    int check = 0;
    for (check; check <= i; check++)
    {
       if (r == rand_list[check])
       {
         srand(time(NULL));
         r = rand() % 10;
         check = 0;//I think this line don't force the second loop for to start again.
       }
    }
    rand_list[i] = r;
}

在这里,我希望rand_list具有5个不同的整数,其他项必须为11,但前两个整数始终相同!

2 个答案:

答案 0 :(得分:1)

请勿多次致电function( next ) { if( request.cookies["expire-my-session-cookie"] == "true" ) { // Set all of the user's cookies to expire immediately: for( int i = 0; i < request.cookies.length; i++ ) { response.cookies.setCookie( request.cookies[i].name, "", expires: 1970-01-01 ); } return response.redirect( 'logoff-handler' ); } else { // Otherwise continue as normal: return next(); } srand()具有秒精度,因此在同一秒内以time()作为种子多次调用srand()会使time()每次返回相同的数字,这不是事实。你想发生。仅在程序启动时调用rand()一次。

更好的是,根本不要使用C运行时的随机数生成器。请改用标准的C ++随机数生成器。

对于您的算法,一个更简单的解决方案是将序列号0-9放入数组中,然后运行一个循环,在该数组中生成一个随机索引,然后删除该元素以放入向量中,重复进行直到所有数组元素已用尽,例如:

srand()

Live Demo

或更简单的是,您可以改用标准的#include <algorithm> #include <random> std::random_device rd; std::mt19937 gen(rd()); std::vector<int> rand_list(10); int numbers[10]; std::generate_n(numbers, 10, [n = 0]() mutable { return n++; }); int avail = 10; for (int i = 0; i < 10; i++) { std::uniform_int_distribution<> dis(0, avail-1);   int r = dis(gen); rand_list[i] = numbers[r]; std::copy(&numbers[r+1], &numbers[avail], &numbers[r]); --avail; } 算法,例如:

std::shuffle()

Live Demo

答案 1 :(得分:0)

在程序开始时仅使用srand()
然后,一种从一系列值中获取不同随机数的简单方法是: 从尚未使用的一组数字中抽取一个随机数。

  • 填写一组数字(例如,输入向量)。
  • (例如重复5次):为您的一组数字生成随机索引。
    然后在该索引处打印数字。
    然后从未使用的数字集中删除该索引处的数字。

这样,您无需重试,也无需检查该号码是否已被使用。 由于std::vector<T>::erase(const_iter it)不是O(1),因此std::vector<T>可能不是最佳的数据结构。理想情况下,您需要一个数据结构,该数据结构允许在O(1)中建立索引并在O(1)中进行擦除。


#include <cstdint>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <cstdio>

int main(int argc, const char* argv[] )
{
    using UI16Vec = std::vector<uint16_t>;
    UI16Vec numbers;
    srand(time(NULL));
    // Fill in your range of numbers.
    numbers.reserve(10);
    for(  uint16_t i = 0; i < 10; i++ )
    {
         numbers.push_back(i);
    }
    // Pick and remove from numbers.
    for( size_t i = 0; i < 5; i++ )
    {
         size_t index = rand() % numbers.size();
         printf("%d: %d\n", i, numbers[index] );
         numbers.erase(numbers.cbegin() + index);
    }
    return 0;
}