Ruby随机10位数字生成器位数异常问题求助
为什么你的Ruby代码生成不了10位随机数字?
嘿,我一眼就看出问题所在啦!让咱们一步步拆解你的代码,找出bug:
问题根源
你写的代码里,(0...9).to_a生成的是包含0到8的数组(因为Ruby的...是左闭右开区间,不包含末尾的9),也就是说这个数组只有9个元素:[0,1,2,3,4,5,6,7,8]。
而你用rand(10)会返回0到9之间的随机整数(包含9)。当rand(10)返回9的时候,你去取数组的索引9,这个位置根本不存在元素,结果就是nil。最后调用join的时候,nil会被转换成空字符串,所以你的结果里就会少一位,自然凑不齐10位数字了!
修复方案
其实不用绕这么大弯子,直接生成0-9的随机数就行,给你几种简单的写法:
写法1:最简洁的版本
直接用rand(10)生成单个数字,重复10次再拼接:
10.times.map { rand(10) }.join
rand(10)本身就会返回0到9的整数,完全不需要先创建数组再取索引,既简洁又避免了索引越界的问题。
写法2:修正你的原代码
如果你坚持想用数组的方式,把区间改成(0..9)(左闭右闭,包含9)就行:
10.times.map { (0..9).to_a[rand(10)] }.join
这样数组就包含0到9的所有数字,不管rand(10)返回什么,都能取到对应的元素。
写法3:用SecureRandom(更安全的随机数)
如果是生成用于安全场景的随机数,推荐用Ruby标准库的SecureRandom:
require 'securerandom' SecureRandom.random_number(10**10).to_s.rjust(10, '0')
10**10表示生成0到9999999999之间的随机数,rjust(10, '0')会确保结果是10位,不足的话在前面补0。
验证一下
不管用哪种方法,运行后都会得到一个10位的随机数字字符串,比如4287195306或者0193746285(前导零是允许的,如果你不需要可以额外处理,但你的需求是10位数字,所以前导零没问题)。
内容的提问来源于stack exchange,提问作者Daniel Viglione
相关产品推荐
相关产品推荐

