我是C ++的新手,我一整天都在寻找一种随机选择两个不同整数之一的方法。
到目前为止我发现的所有内容仅适用于范围内的整数(1-10等),而不适用于(1 或 3)。
对于前。我一直在程序的其他地方使用的代码(对于一系列数字)是
int c;
int Min = 1;
int Max = 3;
c = rand() % (Max + 1 - Min) + Min;
返回范围内的随机整数,而不是给定的一个或其他整数。
答案 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
以及4
到std::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_distribution和uniform_int_distribution。
更新。删除了我们将从给定集合中统一选择的声明。由于rand()从[0,RAND_MAX]中选择,只有在上述模运算的除数除(RAND_MAX + 1)时才会出现这种情况。 (对于RAND_MAX为32767或另一个2的幂减去1的大多数实现中的第一个例子都是如此。)然而,来自均匀的缺陷大致为除数/ RAND_MAX的量级。不过,建议使用C ++ 11 uniform_int_distribution。谢谢,Baum mit Augen。