如果你确实用整数大于你的计算机可以处理的整数,那很复杂。
但你必须比int
大整数几个选项,其中包括:unsigned int
,long
,unsigned long
,long long
,unsigned long long
增加就是大型的顺序。数字的大小取决于你的体系结构有多大。
例如,我的机器上,我有以下:
Data Type: Bytes Minimum Maximum
Short SInt: 2 -32768 32767
Short UInt: 2 0 65535
UInt: 4 0 4294967295
SInt: 4 -2147483648 2147483647
ULong: 8 0 18446744073709551615
SLong: 8 -9223372036854775808 9223372036854775807
ULong Long: 8 0 18446744073709551615
SLong Long: 8 -9223372036854775808 9223372036854775807
所以,你可以看到,你可以做出比int
大得多,要做到这一点是32767
一个路数如下:
double a=rand()/(double)RAND_MAX;
unsigned long long random_n=(unsigned long long)(BIG_MAXIMUM_NUMBER*a);
但是,由于浮点数的离散性,这可能意味着某些值将永远不会显示在您的输出流中。
C++ 11有一个库,它解决了这个问题和你提到的问题。其用法示例如下:
const int min = 100000;
const int max = 1000000;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
int random_int = distribution(generator);
只需更改数据类型以满足您的大量需求。
另一种看待这个问题的方法是,我们可以将rand()
解释为返回一个位字段,并且由于它是一个统一的PRNG,因此所有的位字段具有相同的可能性。然后,我们可以多次调用rand()
以获得多个相同可能的位字段并将它们合并为大数字。下面是我们如何将两个8位随机数这样做是为了一个16位的随机数:
uint16 a=(uint16)(rand()&255);
uint16 b=(uint16)(rand()&255);
uint16 random_int=b<<8 | a;
的rand()&255
只保留8的任何数字rand()
回报至少显著位;也就是说,它只保留rand()
的最后一个字节。
(uint16)
将此字节转换为无符号的16位数字。
a<<8
将a
的8位向左移位,这为安全地添加b
腾出空间。
但是,如果rand()
返回一个有符号值,那么最重要的位总是0或1呢?然后,我们可以做到以下几点:
uint16 a=(uint16)(rand()&255);
uint16 b=(uint16)(rand()&255);
uint16 c=(uint16)(rand()&1);
uint16 random_int=c<<14 | b<<7 | a;
我们左移b
只有7位,这样第八至少显著位是随机的。这意味着第14和第15个最低有效位将是非随机的。由于我们想要模仿rand()
的行为,所以我们将第15个最低有效位保持为非随机,并且抓住一个随机位左移到第14个LSB的位置。
假设您掷出两个骰子并添加结果。与7一样有12个可能吗? –
没错。感谢那 – zzz2991
任何想法解决这个问题的方法? – zzz2991