这篇文章是起源于论坛里面网友的一个帖子,本来的要求是:生成1亿个随机的不同16位数。最好是在“16位数”的范围内随机。
一种做法是边生成、边检查重复,有重复的话,继续补充生成。
另一种做法是“先生成全部的数据、再打乱”,然后取出最前面的1亿个即可。(其实,打乱之后,取出其中任意1亿个都可以的。)(其他做法略。)
怎么打乱?用某一种被证明是随机的洗牌算法。(是否更接近于“真正随机”,取决于那个具体的random函数本身。这种洗牌算法本身是真正随机的,据介绍是被证明过的。)
这种洗牌算法是:
for i:=1 to n do swap(a[i], a[random(i,n)]);(注意random的范围是i到n,不是1到n。)
16位数,相当于[0,10^16-1]。(或者从10000........开始也可,看实际的需求。)
用这个范围代替一般‘洗牌’的[1,54]。vb里面建立一个相应的数组。需要1亿个(即10^8个),那么就只要执行1亿次,得到1亿个“swap之后的a[i]”。(需要的话,用format函数再处理一下,补足前导的0。)
但是在具体操作中发现了问题。VB数组(每维)的上下界从-2G到2G-1,就是,最多4G个元素(1G≈10^9)。所以直接生成[0,10^16-1]的数组肯定不行。而且,大数组(数组元素个数*数组的类型的长度)可能远远超过了内存允许的范围。所以
随机数与排列组合:生成1亿个随机的不同16位数
最新推荐文章于 2023-02-21 10:19:27 发布
文章探讨了如何生成1亿个不同的16位随机数,提出两种策略:生成并检查重复和先生成全部再打乱。由于硬件限制,直接生成大数组不可行。通过概率分析,发现在[0,10^16-1]中随机取10^8个数,重复率约为39.3%,表明边生成边检查的策略可行。当范围缩小到10^15时,重复率接近100%。"
112628273,10545810,使用 CSS Checkbox Hack 创建手风琴组件,"['前端开发', 'CSS', 'HTML', '交互设计', '响应式布局']
摘要由CSDN通过智能技术生成