C4s*_*tor 478
1到2 30之间只有3%的数字不在2 25和2 30之间.所以,这听起来很正常:)
因为2 25 /2 30 = 2 -5 = 1/32 = 0.03125 = 3.125%
Bat*_*eba 42
您需要更精确:您需要不同的基数2对数值,但您想要的是什么分布?标准rand()函数生成均匀分布,您需要使用与所需分布关联的分位数函数来转换此输出.
如果您告诉我们分发,那么我们可以告诉您所需的quantile功能.
asp*_*rge 18
如果你想要不同的数量级,为什么不试试pow(2, rand())呢?或者像哈罗德建议的那样直接选择顺序作为rand()?
Fra*_*cia 13
@ C4stor提出了一个很好的观点.但是,对于更一般的情况并且更容易理解人类(基数10):对于1到10 ^ n的范围,~90%的数字是从10 ^(n-1)到10 ^ n,因此, ~99%的数字从10 ^(n-2)到10 ^ n.继续添加任意数量的小数.
有趣的数学,如果你继续这样做n,你可以看到从1到10 ^ n,99.9999 ...%= 100%的数字是从10 ^ 0到10 ^ n用这种方法.
现在关于代码,如果你想要一个随机数量的随机数,从0到10 ^ n,你可以这样做:
生成从0到n的小随机数
如果您知道n的范围,则生成一个10 ^ k的大随机数,其中k> max {n}.
剪下较长的随机数,得到这个大随机数的n位数.
Flo*_*ris 13
上面已经给出并接受了基本(和正确)答案:0到9之间有10个数字,10到99之间有90个数字,100到999之间有900个数字等.
为了获得具有近似对数分布的分布的计算有效方法,您希望将随机数右移一个随机数:
s = rand() & 31; // a random number between 0 and 31 inclusive, assuming RAND_MAX = 2^32-1
r = rand() >> s; // right shift
Run Code Online (Sandbox Code Playgroud)
它并不完美,但它比计算速度快得多pow(2, rand()*scalefactor).从某种意义上讲,它将是"块状的",因为对于2到2的数字(128到255的均匀,256到1023的密度的一半等),分布将是均匀的.
以下是数字0到31的频率的直方图(在1M样本中):

0到2 ^ 29和2 ^ 29和2 ^ 30之间的数字完全相同.
查看问题的另一种方法是:考虑生成的随机数的二进制表示,最高位为1的概率等于1/2,因此,在一半的情况下得到29阶.你想要的是看到一个低于2 ^ 25的数字,但这意味着5个最高位都是零,这发生在1/32的低概率.有可能即使你长时间运行它,你也永远不会看到低于15的顺序(概率就像是连续6次滚动6次).
现在,关于种子问题的一部分.不,种子不可能确定生成数字的范围,它只是确定第一个初始元素.将rand()视为范围内所有可能数字的序列(预定排列).种子确定从序列中开始绘制数字的位置.这就是为什么如果你想要(伪)随机性,你使用当前时间来初始化序列:你不关心你开始的位置是不是均匀分布,重要的是你永远不会从同一个位置开始.