【问题标题】:How to extract a random number from an array and the [closed]如何从数组中提取随机数和[关闭]
【发布时间】:2022-01-23 05:42:33
【问题描述】:

我正在尝试编写从数组中定义的一组值中提取随机数的代码。一旦提取了一个数字,我希望它不能再次被提取,因此从数组中删除(或不考虑)。 除了数组的声明和数字的提取,我不知道该怎么做。你能帮帮我吗?

例子:

my array[]={1,2,3,4}

我想在每个循环中提取一个随机数。 第一个循环提取 3.

我希望不再提取 3。 (我的解决方案是将数组转入myarray[]={1,2,4},但我不知道该怎么做)

【问题讨论】:

  • 注意:您不能从数组中删除数字。你能做的最好的就是在上面写。
  • 旁注:这是一个可以帮助您入门的文档页面:en.cppreference.com/w/cpp/algorithm/random_shuffle
  • 您使用std::shufflevector 洗牌一次,然后继续挑选并删除列表中的最后一项。你拿最后一个是因为它比删除第一个要便宜得多。当您删除第一个项目后,所有项目都向上移动一个空格以覆盖已删除的元素并更新vector 的新端的位置。如果您删除最后一个,所有vector 所要做的就是更新vector 的末尾所在的位置。
  • 如果你不能使用vector,你可以用一个简单的数组做同样的事情。保留指向数组中最后一项的指针。当您移除最后一个时,将指针移回一个插槽。当指针位于数组的开头时,将数组标记为空。
  • @user4581301 random_shuffle 已被弃用,据我所知不应使用。此外,如果这是在 Arduino 上,如标签所示,STL 可能不可用。

标签: c++ arrays random arduino extract


【解决方案1】:

您可以使用 C+17 std::sample 从序列 [first;最后)(无需更换)。 例如,如果您想从数组中提取 3 个随机数:

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

int main()
{
    std::vector<int> vec = {1, 2, 3, 4};
    std::vector<int> rand_numbers;
    std::sample(vec.begin(), vec.end(), std::back_inserter(rand_numbers),
                3, std::mt19937{std::random_device{}()});
    // print out the result
    for (const auto el : rand_numbers)
        std::cout << el << ' ';
    std::cout << '\n';
}

你可以找到一个活生生的例子here

如果你的编译器支持 C++20,你可以使用 std::ranges::samples 代替:

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

int main()
{
    std::vector<int> vec = {1, 2, 3, 4};
    std::vector<int> rand_numbers;
    std::ranges::sample(vec, std::back_inserter(rand_numbers),
                3, std::mt19937{std::random_device{}()});
    // print out the result
    for (const auto el : rand_numbers)
        std::cout << el << ' ';
    std::cout << '\n';
}

你可以找到一个活生生的例子here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 1970-01-01
    相关资源
    最近更新 更多