【发布时间】:2018-02-28 14:25:05
【问题描述】:
随机函数通常在给定范围内生成随机数。但是可以从预定义的列表中随机选择吗?例如,我有 [1,4,5,6],我只想从这个列表中随机选择。如果是这样,怎么做? 谢谢 :) P.s:: C++ 代码对我有很大帮助^^
【问题讨论】:
随机函数通常在给定范围内生成随机数。但是可以从预定义的列表中随机选择吗?例如,我有 [1,4,5,6],我只想从这个列表中随机选择。如果是这样,怎么做? 谢谢 :) P.s:: C++ 代码对我有很大帮助^^
【问题讨论】:
下面的代码会有所帮助,我们可以在集合中选择一个随机索引,而不是选择一个随机整数;
int numbers[4] = {1,4,5,6};
srand (time(NULL));
int index = rand() % 4;
int number = numbers[index];
这是一个使用 <random> 的 C++11 版本:
#include <random>
int numbers[4] = {1,4,5,6};
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(0,3);
int index = distribution(generator); // generates number in the range 0..3
int number = numbers[index];
【讨论】:
<random>。
<random> 替代方案,似乎<random> 不支持从列表中选择?是吗?
rand()%n 是有偏见的,除非n 划分RAND_MAX+1。 n=4 通常是这种情况,但通常情况并非如此。虽然对于小型 n 和可能可以接受的临时用例。
这样做的好方法可能是使用随机播放。基本上,你打乱数组,然后开始一个一个地选择数字
#include <iostream> // std::cout
#include <algorithm> // std::shuffle
#include <array> // std::array
#include <random> // std::default_random_engine
int main () {
std::array<int, 4> foo {1,4,5,6};
std::shuffle(foo.begin(), foo.end(), std::default_random_engine(12345));
std::cout << "shuffled elements:";
for (int x: foo)
std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
【讨论】: