C++从特定数组生成随机数发生器

3
我想能够从一个我指定的数组中生成随机数。例如:我想要从数组{2,6,4,8,5}中生成一个随机数。只是这个数组中没有我想要生成的模式。
我只能查到如何使用srand()从1-100生成随机数的教学视频 https://www.youtube.com/watch?v=P7kCXepUbZ0&list=PL9156F5253BE624A5&index=16,但我不知道如何指定它所搜索的数组...
顺便说一下,我的代码类似于这样...
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(int argc, char*argv[])
{
    srand(time(0)); 

    int i =rand()%100+1;
    cout << i << endl; 
    return 0;
}

1
离题了,因为这对于这种情况非常低效,但在其他情况下非常有用。使用 std::random_shuffle 对数组进行随机排序(请参见此处),然后取 array[0]。这是一个很好的方法来获得一组不重复的随机数。 - user4581301
3个回答

5
这里是使用现代C++的方法:
#include <array>
#include <random>
#include <iostream>

auto main() -> int
{
    std::array<int, 10> random_numbers = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 };

    std::random_device random_device;
    std::mt19937 engine(random_device());
    std::uniform_int_distribution<int> distribution(0, random_numbers.size() - 1);

    const auto random_number = random_numbers[distribution(engine)];
}

你可以在这里阅读有关C++标准库中随机功能的更多信息:http://www.cplusplus.com/reference/random/

1
@Funky,这在另一个答案中链接的优秀视频中有解释:https://dev59.com/eJrga4cB1Zd3GeqPjTWn#39161875 - CompuChip
1
正确的做法,但要注意如果使用标准mingw,请小心random_device。它总是返回相同的数字。并不是完全随机的设备。 - user4581301
1
这些类也都在<random>文档中有描述。 - Michael
@Funky 我不确定我是否理解正确,但如果你想在每次运行/循环/调用时生成一个不同于上一个的随机数,你可以记住上一个选定的随机数,将当前选定的随机数与其进行比较,如果相同,则从范围内选择一个新的索引而不是前一个随机数的索引(例如,将此新索引添加到前一个索引并“环绕”)。 - CppChris
1
@ChrisG 很遗憾,我对此没有一个好的答案。我一直在使用chrono高分辨率时钟的毫秒计数。 - user4581301
显示剩余5条评论

0

使用模数来改变输出范围可能会引入轻微的偏差。请参见此讲座。如果您担心这个问题,请考虑使用“随机”标准库,因为您正在使用c++。


是的,但这只是一条评论,而不是答案。可以通过扩展解释来挽救它。 - user4581301
没有50个声望值就无法发表评论。不过没关系,其他答案已经足够了。 - user6760598

0

为这些数组生成随机索引:

在生成随机值之前,让我们初始化“系统”:

srand((unsigned int)time(0)); // somewhere in the beginning of main, for example

然后你在某个地方初始化了数组,就像这样:

std::vector<int> array;
fillOutArray(array);

你在第一条消息中得到了这样的东西:{10, 5, 3, 6}
现在你想从这个数组中获取一个随机值(在这些数字10、5、3或6中)。
auto index = rand() % (array.size());
auto yourValue = array[index];

就是这样。


嗨!抱歉,我不太明白?我想生成的数字实际上是那五个。但是我应该把它们放在你提供的代码中的哪里呢?抱歉,我对此很陌生。 - Funky
@Funky请稍微修改一下我的信息。现在可能更清楚了。 - fgrdn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接