随机选择不在范围内的2个整数?

时间:2018-03-18 20:38:04

标签: c++ random int

我是C ++的新手,我一整天都在寻找一种随机选择两个不同整数之一的方法。

到目前为止我发现的所有内容仅适用于范围内的整数(1-10等),而不适用于(1 3)。

对于前。我一直在程序的其他地方使用的代码(对于一系列数字)是

int c;
int Min = 1;
int Max = 3;
c = rand() % (Max + 1 - Min) + Min;

返回范围内的随机整数,而不是给定的一个或其他整数。

3 个答案:

答案 0 :(得分:2)

首先,你不应该在C ++中使用C random。随机使用C ++。

从一组元素中选择的方法是随机生成一个索引。您可以将逻辑包装在一个类中:

#include <random>
#include <iostream>
#include <vector>
#include <initializer_list>

class Random_choice
{
    std::random_device rd_{};

public:
    template <class T> auto get_choice(std::initializer_list<T> elements) -> T
    {
        std::uniform_int_distribution<std::size_t> dist{0, elements.size() - 1};
        std::size_t i = dist(rd_);

        return *(elements.begin() + i);
    }
};


int main()
{
    Random_choice rc;

    std::cout << rc.get_choice({3, 5}) << std::endl;
}

或者没有抽象:

#include <random>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> choices = {3, 5};

    std::random_device rd;
    std::mt19937 e{rd()};
    std::uniform_int_distribution<std::size_t> dist{0, choices.size() - 1};

    std::size_t i = dist(e);

    std::cout << choices[i] << std::endl;
}

答案 1 :(得分:1)

如果你有一系列你不想要数字的数字,那么你有两个范围你 想要数字。

例如,如果您的范围是1到3(含),那么您希望数字的两个范围是-∞到0和4到∞。

Infinity在计算机上有点棘手,但可以通过std::numeric_limits轻松模拟,以获得所需类型的最小值和最大值。

因此,在您的情况下,您需要std::numeric_limits<int>::min()0以及4std::numeric_limits<int>::max()范围内的随机数。

从随机选择任一范围中获得两个随机数,首先选择(随机)一个范围,然后从中获取一个数字。然后再次(随机)选择一个范围并从中获得第二个数字。

答案 2 :(得分:1)

随机选择两个整数之一,a或b:

c = (rand() % 2) ? a : b

从整数列表中随机选择一个整数:

std::vector<int> numbers;
c = numbers.at(rand() % numbers.size());

从两个区间[a,b)和[c,d)中随机选择一个整数:

H = (b-a);
L = (b-a) + (d-c);
k = rand() % L;
c = (k < H) ? (a + k) : (c + (k - H));

如果您使用C ++ 11,那么您肯定可以查看pseudo-random numer generation,例如discrete_distributionuniform_int_distribution

更新。删除了我们将从给定集合中统一选择的声明。由于rand()从[0,RAND_MAX]中选择,只有在上述模运算的除数除(RAND_MAX + 1)时才会出现这种情况。 (对于RAND_MAX为32767或另一个2的幂减去1的大多数实现中的第一个例子都是如此。)然而,来自均匀的缺陷大致为除数/ RAND_MAX的量级。不过,建议使用C ++ 11 uniform_int_distribution。谢谢,Baum mit Augen。