2016-09-29 120 views
1

我有一个整数列表intList = {1, 3. 5. 2}(它只是一个示例整数和大小都未知)。我必须从该列表中选择一个随机数。从整数列表中选择一个随机数

RandomInt = rand() % intList.size() 

将以类似的方式工作为RandomInt = rand() % 4

和产生到4到1之间的数randon而intList中是不同的。

如果我使用RandomInt = std::random_shuffle = (intList, intList.size()) 仍然出错。我不知道如何从列表中选择一个随机数。

+0

RandomInt =的std :: random_shuffle(intList中,intList.size()); –

+1

'std :: random_shuffle'的范围从[first,last)到functor的可选附加参数。它也返回'void'。一个正确的调用看起来像'std :: random_shuffle(intList.begin(),intList.end())' –

回答

2

你只需要使用“间接”:

std::vector<int> list{6, 5, 0, 2}; 
int index = rand() % list.size(); // pick a random index 
int value = list[index]; // a random value taken from that list 
+0

如果列表的大小是固定的,考虑使用'std :: array'而不是'std :: vector' 。 –

4

因为,作为一个子步骤中,您需要生成随机数,你不妨做它的C++ 11的方式(而不是使用模,这亦是known to have a slight bias toward low numbers):

假设您从

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

int main() 
{ 
    const std::vector<int> intList{1, 3, 5, 2}; 

现在,定义随机生成:

std::random_device rd; 
    std::mt19937 eng(rd()); 
    std::uniform_int_distribution<> distr(0, intList.size() - 1); 

当你需要生成一个随机元素,你可以这样做:

intList[distr(eng)]; 
} 
+2

你可能会想提一下,这将具有非常优越的rand和mod方式的统计特性。 – Bathsheba

+0

@Bathsheba谢谢!刚刚添加了一个关于已知偏见的链接。那是你的意思吗? –

+0

我不认为随机数发生器是这个答案的好选择。对C++来说,它们是一个可怜的,毫无意义的难以使用的补充,只有在强制时才应该使用它们。没有那么可悲,毫无意义地使用时间,但距离不远。 – 6502

0
int arrayNum[4] = {1, 3, 5, 2}; 
    int RandIndex = rand() % 5; // random between zero and four 
    cout << arrayNum[RandIndex];