随机数与排列组合:生成1亿个随机的不同16位数

这篇文章是起源于论坛里面网友的一个帖子,本来的要求是:生成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]的数组肯定不行。而且,大数组(数组元素个数*数组的类型的长度)可能远远超过了内存允许的范围。所以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值