加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:14:11 所属栏目:百科 来源:网络整理
导读:从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个随机位,但我们在这里会忘记这一点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读