有没有一种方法可以让我从0-10亿中得到一个随机数

Is there a way I can get a random number from 0 - 1 billion?

本文关键字:0-10亿 一个 随机数 一种 方法 有没有      更新时间:2023-10-16

我现在不关心效率。我只是在寻找一种可以生成0到10亿个随机数的好方法。我试过做rand()*rand(。我希望范围更广一些。有人有什么建议吗?

当然,只需使用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';

(从这里开始,稍作修改以满足OP的需求)将满足您的需求。

如果需要,还存在浮点值的模拟功能。


备注:在不太可能的情况下,您的平台的int无法容纳10亿,或者如果您需要更大的数字,您也可以使用更大的整数类型,如

std::uniform_int_distribution<std::int64_t> dis(1, 1000000000);

还应注意,此处提出的mt播种并非最佳;请参阅我的问题,了解更多信息。

十亿刚好低于2^30。如果不能直接生成一个30位数字,那么生成两个15位数字,将一个数字左移15位,然后与未移位的数字异或,得到一个30位数。

如果30位结果超过10亿,则丢弃它并生成另一个30位数字。2^30=1073741824,因此在大约7%的情况下结果会太大。

随机序列号/序列号(唯一和不可预测)

如果只允许随机数具有唯一值

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万亿个不可预见的随机数。