是否有一些功能,类似srand()
,我需要调用以确保std::random_shuffle()
总是产生不同的结果?即如果我用相同的数据多次调用它,我希望每次订单都不一样。我如何确定这一点?如何确保std :: random_shuffle总是产生不同的结果?
回答
std::random_shuffle
有两种形式。一个需要2个参数(开始/结束迭代器),另一个需要3个(开始/结束迭代器和一个随机生成器)。
第一种形式使用std::rand()
,因此您将使用std::srand()
为其随机数生成器生成种子。您也可以使用3参数版本并自己提供RNG。
据我了解,第一种形式如何实现它是它的业务。有些平台可能不使用'std :: rand'。 –
你说得对。我在看libstdC++版本。原作者应参考STL的文档。或者如果他们不想依赖它,他们应该使用第三种形式并使用'boost :: random'或C++ 0x'std :: random'。 –
std::random_shuffle
具有用于指定RNG的模板过载。
template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle (RandomAccessIterator first, RandomAccessIterator last,
RandomNumberGenerator& rand);
我想你可以给一个随机数发生器仿函数到std :: random_shuffle,这样你就可以能够完全控制随机数生成。寻找here,这个仿函数代替了RandomNumberGenerator模板参数。
一般称之为srand(time(NULL))
之前调用的std :: random_shuffle()会给你你需要什么,它会给你不同的结果,每次调用的std ::时间random_shuffle()。这是因为std :: random_shuffle()在许多填充实现中(例如VS2008和gcc)在内部调用rand()。
当然,如果你想用另一个参数调用另一个超载的std :: random_shuffle,你可以自己修改一个RNG。
作为最后的手段,您可以:
- 呼叫
std::random_shuffle
- 计算序列的哈希值,将其存储在
std::set
- 丢弃该散列值是否已经存在
我没有看到如何使用自定义生成器可以保证序列是唯一的。因为C++ 14
random_shuffle已过时(在C++ 17除去)中,用混洗取代(因为存在C++ 11) http://en.cppreference.com/w/cpp/algorithm/random_shuffle
可能的使用:
shuffle(items.begin(), items.end(), std::default_random_engine(std::random_device()()));
- 1. 的std :: random_shuffle产生相同的结果,每次
- 2. C++ random_shuffle总是给了相同的结果
- 3. 天计算器不总是产生准确的结果
- 4. 同样的计算结果如何产生不同的结果
- 5. 总结表中的列不会产生正确的结果
- 6. 这个空比较总是会产生相同的结果吗?
- 7. buddy.hashers总是产生不同的散列
- 8. NSComparisonResult不会产生正确的结果
- 9. 的XPath产生不同的充结果
- 10. 程序总是产生相同的值?
- 11. GNU产生完全不同的结果
- 12. Html.ActionLink根据URL产生不同结果
- 13. bloginfo('template_url') - 产生不同的结果
- 14. PHP strtotime产生不同的结果
- 15. BSR和BSF产生相同的结果
- 16. 产生相同结果
- 17. 结果总是正确的?
- 18. 产生不同于其他查询的MySQL的结果结果
- 19. 如何用DEAP产生不同的随机结果?
- 20. 切换如果和否则不会产生相同的结果
- 21. strcmp始终产生相同的结果
- 22. boost :: thread在每次运行时产生不同的结果
- 23. 使用std :: random_shuffle用的std ::阵列
- 24. .append()为不同的参数类型产生不同的结果
- 25. 两个相同的公式产生不同的结果
- 26. nunit-console测试从不同位置产生不同的结果
- 27. ZIP没有产生正确的结果
- 28. 运行Ruby作为index.cgi,[1,3,5] .shuffle总是产生相同的结果
- 29. MSXML2.XMLHTTP产生不同的结果,如果我只是在web浏览器
- 30. OpenNLP产生不良结果
那并不” t听起来对我来说是非常随机的... – Blindy
@Bindy:它是随机的,但结果不是均匀分布的。 –
srand是相当不错的。如果它不足以满足您的需求,请搜索其他随机生成器(可能是提升) –