我现在不关心效率。我只是在找一个体面的方式,我可以生成从0到10亿的随机数。我已经尝试过rand()* rand(),但它只给了我估计超过大约1000万的数字。我希望范围更加分散。有人有什么建议吗?
答案 0 :(得分:10)
当然,只需使用C ++的现代<random>
工具:
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(1, 1000000000);
for (int n=0; n<10; ++n)
std::cout << dis(gen) << ' ';
std::cout << '\n';
(来自here,略微修改以满足OP的需要)将做你需要的。
如果需要,还存在浮点值的模拟函数。
备注:在极少数情况下,您的平台int
无法容纳10亿,或者您需要更大的数字,您还可以使用更大的整数类型:
std::uniform_int_distribution<std::int64_t> dis(1, 1000000000);
另请注意,此处显示的播种mt不是最佳的;有关详细信息,请参阅我的问题here。
答案 1 :(得分:1)
随机串行/序列号(独特且无法预测)
如果只允许随机数具有唯一值。
12345678900 72 12345678901 34. 12345678926 34. 12345678951 24。 12345678976 84. 12345678902 65. 12345678927 63. 12345678952 51.
12345678977 67. 12345678903 09. 12345678928 11. 12345678953 19.
12345678978 53. 12345678904 22. 12345678929 44. 12345678954 78.
12345678979 04. 12345678905 21. 12345678930 85. 12345678955 76.
12345678980 35. 12345678906 37. 12345678931 01. 12345678956 31。 12345678981 73. 12345678907 42. 12345678932 55. 12345678957 12。 12345678982 16. 12345678908 20. 12345678933 95. 12345678958 87。 12345678983 77. 12345678909 71. 12345678934 49. 12345678959 83。 12345678984 13. 12345678910 32. 12345678935 60. 12345678960 50。 12345678985 45. 12345678911 58. 12345678936 86. 12345678961 02。 12345678986 61. 12345678912 66. 12345678937 30. 12345678962 64。 12345678987 23. 12345678913 10. 12345678938 48. 12345678963 94。 12345678988 40. 12345678914 79. 12345678939 89. 12345678964 27。 12345678989 70. 12345678915 93. 12345678940 43. 12345678965 92。 12345678990 08. 12345678916 46. 12345678941 72. 12345678966 03。 12345678991 88. 12345678917 57. 12345678942 14. 12345678967 47。 12345678992 65. 12345678918 52. 12345678943 38 12345678968 62.
12345678993 17. 12345678919 15. 12345678944 75. 12345678969 80。 12345678994 54. 12345678920 41. 12345678945 07. 12345678970 18。 12345678995 28. 12345678921 62. 12345678946 25. 12345678971 58。 12345678996 74. 12345678922 26. 12345678947 69. 12345678972 43。 12345678997 29. 12345678923 91. 12345678948 82. 12345678973 59。 12345678998 33. 12345678924 05. 12345678949 56. 12345678974 81。 12345678999 78. 12345678925 36. 12345678950 68. 12345678975 90。 12345679000 06。
101个唯一随机数。
每个数字由13个数字组成,其中前11个数字是连续数字,第12和第13个数字一起形成一个随机数。 最后两位数将11位序列号转换为13位随机数。因此,当通过添加1或2位将序号变换为随机数时,这种随机化不需要基于数学的算法。
即使这两个数字是由基于数学的算法创建的,也可以有无数这样的算法来创建两位数的随机数。
因此,我的主张是,当顺序号附加1,2或3个随机创建的数字时,您会向其授予随机性,并且此类随机序列号是不可预测的。
因此,最简单的11位数序列可以容纳10亿个不可预测的随机数,只有14位数的序列可以容纳1万亿个不可预测的随机数。
答案 2 :(得分:0)
10亿只低于2 ^ 30。如果你不能直接生成一个30位数字,那么就产生两个15位数字,将一个左移15位,用未移位数字进行异或,得到一个30位数字。
如果30位结果超过10亿,则将其丢弃并生成另一个30位数字。 2 ^ 30 = 1073741824,因此在大约7%的情况下结果只会太大。