【问题标题】:Randomly selecting 2 integers not in a range?随机选择2个不在范围内的整数?
【发布时间】:2018-03-18 20:38:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 什么?范围呢?您的意思是在两个整数之间进行选择吗?那么范围与它有什么关系呢?
  • 这是一个令人困惑的问题...
  • 是的,在两个整数之间随机选择。范围与它没有任何关系,只是我发现的所有内容都为我提供了选择范围内的数字的表达式,而不是两个完全不相关的整数
  • rand() & 1 ? Min : Max;
  • array_index = rand() % array_count;

标签: c++ random int


【解决方案1】:

首先你不应该在 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;
}

【讨论】:

    【解决方案2】:

    随机选择两个整数之一,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。

    【讨论】:

    • Another fun trick is to shuffle vector 并取第一个元素。
    • 不是一致随机的,除非你的模运算符的右操作数除以RAND_MAX
    • 嗯,实际上必须除RAND_MAX + 1。无论如何,重点是。
    【解决方案3】:

    如果您有一个不希望输入数字的数字范围,那么您有 两个 您希望输入数字的范围确实

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

    Infinity 在计算机上有点棘手,但可以很容易地模拟,例如 std::numeric_limits 以获得所需类型的最小值和最大值。

    因此,在您的情况下,您需要在std::numeric_limits&lt;int&gt;::min()04std::numeric_limits&lt;int&gt;::max() 范围内的随机数。

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

    【讨论】:

    • 请注意,以适当的概率选择其中一个范围,以防它们不是同样大。
    • 我觉得他不是这个意思
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-14
    • 1970-01-01
    • 2015-07-09
    • 2022-11-13
    相关资源
    最近更新 更多