代码之家  ›  专栏  ›  技术社区  ›  tevyefegeleh

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

  •  0
  • tevyefegeleh  · 技术社区  · 6 年前

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

    到目前为止,我发现的一切都只适用于范围(1-10等)内的整数,而不是(1 3) 。

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

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

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

    3 回复  |  直到 6 年前
        1
  •  2
  •   bolov    6 年前

    首先,您不应该在C++中使用C random。使用C++random。

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

    #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
  •  1
  •   S. Huber    6 年前

    随机选择两个整数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\u MAX]中进行选择,因此只有当上述模运算的除数除以(rand\u MAX+1)时,这才是真的。(在大多数实现中,第一个示例的RAND\u MAX是32767或另一个2-1的幂。)然而,一致性的缺陷大约是除数/RAND\u MAX的数量级 uniform\u int\u分布 建议改为。谢谢,鲍姆·米特·奥根。

        3
  •  1
  •   Some programmer dude    6 年前

    如果你有一系列你不想要的数字,那么你有 您需要的范围 希望输入数字。

    例如,如果您的范围是1到3(包括1到3),那么您确实需要数字的两个范围是-到0,以及4到-。

    无穷大在计算机上有点棘手,但很容易被模拟,例如 std::numeric_limits 获取所需类型的最小值和最大值。

    所以在你的情况下,你需要一个随机数 std::numeric_limits<int>::min() 0 4 std::numeric_limits<int>::max()

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