遗憾的是,有时会失败的小随机字符串生成器请帮我修理一下

时间:2010-12-10 17:27:25

标签: ruby algorithm random

从一些StackOverflow回答我有一个简洁的小函数来生成一个只有a-z和0-9字符的10个字符串: rand(36**10).to_s(36)

问题是它有时会失败并且只生成9个字符。但我真的很喜欢它的简易性和速度。有任何建议如何解决它,以便我可以确定它总是生成10个字符? (没有任何循环或检查。)

5 个答案:

答案 0 :(得分:5)

当你随机生成一个小于36 9 的数字时,它最终成为一个9个字符的字符串。左键用零填充:

rand(36**10).to_s(36).rjust(10, "0")

示例:

irb(main):018:0> (36**9).to_s(36)
=> "1000000000"
irb(main):019:0> (36**9 - 1).to_s(36)
=> "zzzzzzzzz"
irb(main):020:0> (36**5).to_s.rjust(10, "0")
=> "0060466176"

答案 1 :(得分:0)

这将生成一个随机的字符和数字字符串,但不会出现多个单个字符

(('a'..'z').to_a + (0..9).to_a).shuffle[1..10].join

要“修复”您刚刚执行此操作的可能结果的数量:

a = (('a'..'z').to_a + (0..9).to_a)
a = a * 10
p a.shuffle[1..10].join

答案 2 :(得分:0)

怎么样:

>> require 'md5'
=> true
>> MD5::hexdigest(Time.now.to_f.to_s)[0..9]
=> "89d83d3516"

答案 3 :(得分:0)

从@Mark Rushakoff使用rand(36**5)的想法开始,这会将零填充字符串随机化为字符:

('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "4a04020701"
('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "0e092f0a03"
('%010x' % [rand(36**5)]).chars.to_a.shuffle.join # => "03e240e800"

要解决Ruby不允许在format中使用零填充字符串,我必须切换到方法链中的填充,这基本上是Mark所做的。为避免前导零的字符串,将其分解为数组并对字符串进行洗牌并重新加入。

rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "e80000h00b"
rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "00bv0dy00p"
rand(36**5).to_s(36).rjust(10, '0').chars.to_a.shuffle.join # => "v0hw000092"

答案 4 :(得分:0)

(('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a).sample(8).join