据我所知rand()不会产生均匀的随机分布。什么函数/算法可以让我这样做?我不需要密码随机性,只需要一个统一的随机分布。最后,什么库提供这些功能? 谢谢!什么是rand()的合适替代品?
回答
rand()
确实产生一个统一的(伪)随机分布。
实际需求,从C standard(3.7 MB PDF),第7.20.2.1,是:
的兰特函数计算伪随机整数的序列在 范围为0〜RAND_MAX。
其中RAND_MAX至少为32767.这是公认的含糊不清,但意图是它给你一个统一的分布 - 实际上,这就是实现实际做的。
该标准提供了一个示例实现,但C实现不需要使用它。
实际上,那里肯定有更好的随机数生成器。 rand()
的一个具体要求是它必须产生与给定种子完全相同的数字序列(参数为srand()
)。您的描述并不表示这对您会造成问题。
一个问题是,rand()
给你在一个固定的范围内统一分布的数字。如果你想要不同范围的数字,你必须做一些额外的工作。例如,如果RAND_MAX是32767,则rand()
可以产生32768个不同的值;您不能在0..9范围内获得随机数字而不会放弃某些值,因为无法将这些32768个不同值均匀分配到10个相同大小的桶中。
其他PRNGs可能会给你比rand()
更好的结果,但他们仍然可能会受到同样的问题。
像往常一样,comp.lang.c FAQ比我做得更好;见问题13.15至13.21。
downvoter会照顾评论吗? –
那么,the question of whether or not an actual pseudorandom generator exists is still open。这就是说,快速搜索显示that there may be some slightly better alternatives。
通常,我们会解决“无*已知*有效计算”,并附带一个“并且没有研究表明任何时候很快就会发现”的副命令。 –
这是一篇用C#编写的文章和stand-alone random number generator。代码很小,很容易移植到C++等。
每当有这个问题出现时,有人回应说,你不应该使用你自己的随机数发生器,但应该留给专家。我回应说,你不应该拿出你自己的算法。把它留给专家,因为它确实非常微妙。但它可以,甚至有利于你自己的实现。这样你就知道正在做什么,并且你可以在不同的语言或平台上使用相同的方法。
该文章中的算法由随机数生成中的顶级专家George Marsaglia提供。即使代码很小,该方法也能很好地适用于标准测试。
的BSD random()
功能(包含在POSIX/SUS的XSI选项)几乎是普遍可用,比rand
在大多数系统更好的(除了一些地方rand
实际使用random
,因此他们都还不错)。
如果你宁愿去系统库外,这里是你的选择一些好的信息:
http://guru.multimedia.cx/category/pseudo-random-number-generators/
(从FFmpeg的名声迈克尔Niedermayer)
- 1. 这是什么合适的替代品.__ LZtextclip.text在Open laszlo 5.0
- 2. 什么是iframe替代品?
- 3. 什么是APC替代品?
- 4. 什么是Erlang替代品?
- 5. 任何合适的替代品Double.Nan
- 6. 什么是Set-WindowsAzureLog的替代品?
- 7. 什么是matlabFunction的好替代品?
- 8. 什么是GeoEXT的替代品?
- 9. 什么是avcodec_thread_init的替代品?
- 10. 什么是REBASE.EXE的替代品?
- 11. 什么是Threadpool的替代品?
- 12. 什么是硒的一些替代品?
- 13. 什么是Facebook的开源替代品?
- 14. Selenium webdriver:什么是browserbot的替代品?
- 15. 什么是:: shadow和/ deep /的替代品?
- 16. 什么是Contacts.People.NOTES的替代品?
- 17. 什么是Lattix的开源替代品?
- 18. 什么是IncludeInAll(...)的替代品?
- 19. 什么是checkValidity()的jQuery替代品?
- 20. 什么是iPhone的键盘替代品?
- 21. 什么是FilteredQueryDescriptor的替代品?
- 22. 什么是Silverlight中DataTrigger的替代品
- 23. 什么是grails.converters.deep.JSON的替代品
- 24. 什么是Facebook Fans API的替代品?
- 25. 什么是start-mapred.sh的替代品?
- 26. 什么是XCTAssertEqualObjects的替代品?
- 27. 什么是可用的XUL替代品?
- 28. 什么是UIAccessibilityVoiceOverStatusChanged的替代品
- 29. 什么是443端口的替代品?
- 30. 弃用“managedQuery”的合适替代者是什么?
你需要像'unidrnd'这样的东西,请参阅http://octave.sourceforge.net/octave/function/unidrnd.html ..还有一个C++ API,我猜想,试着挖出代码:) – 2011-09-14 18:54:53