当前位置 : 主页 > 编程语言 > c++ >

如何从C容器中获取随机元素?

来源:互联网 收集:自由互联 发布时间:2021-06-23
从STL范围获取[伪]随机元素的好方法是什么? 我能想到的最好的是做std :: random_shuffle(c.begin(),c.end())然后从c.begin()获取我的随机元素. 但是,我可能想要一个const容器中的随机元素,或者我可
从STL范围获取[伪]随机元素的好方法是什么?

我能想到的最好的是做std :: random_shuffle(c.begin(),c.end())然后从c.begin()获取我的随机元素.

但是,我可能想要一个const容器中的随机元素,或者我可能不想要完全洗牌的成本.

有没有更好的办法?

这里使用%的所有答案都是不正确的,因为rand()%n会产生有偏差的结果:想象RAND_MAX == 5且元素数是4.然后你会得到两倍数字0和1而不是数字2或3.

一个正确的方法是:

template <typename I>
I random_element(I begin, I end)
{
    const unsigned long n = std::distance(begin, end);
    const unsigned long divisor = (RAND_MAX + 1) / n;

    unsigned long k;
    do { k = std::rand() / divisor; } while (k >= n);

    std::advance(begin, k);
    return begin;
}

另一个问题是std :: rand只假设有15个随机位,但我们在这里会忘记这一点.

网友评论