-2

我正在使用来自 Github 的 Luhn 库。Luhn 类有更多方法,但我只对“生成”和“有效?”感兴趣。方法。

  m = Luhn.generate(9) # generates a random number like [123456789] or [098765432]
  Luhn.valid?(m)   # returns true or false based on Luhn checksum passing

但我不希望生成的数字以“0”开头。

那么我该如何输入我的 ruby​​ 脚本:

  1. 丢弃生成的以 开头的数字"0"
  2. 生成另一个数字并再次检查,直到m[0]非零。
  3. 在生成的数字上运行valid?():如果为假,则生成另一个非零数字,直到为真。
  4. 将有效的 9 位数字返回给呼叫者代码
4

1 回答 1

1

这对你有用吗?(非常基本的递归)

require 'luhn'
def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" && Luhn.valid?(m) ? m : generate_non_zero_luhn(size)
end

示例输出

10.times.map { generate_non_zero_luhn }
#=> ["582428355", "353646136", "821379013", "818135220", "696652767", 
     "934766437", "885229401", "226319044", "682121645", "688197078"]

虽然我认为不需要有效性检查,因为Luhn正在生成数字所以它总是有效的。例如

1_000_000.times.map { Luhn.valid?(Luhn.generate(9))}.any?{|val| !val}
#=> false

那么方法可以变成

def generate_non_zero_luhn(size=9)
  m = Luhn.generate(size)
  m[0] != "0" ? m : generate_non_zero_luhn(size)
end
于 2015-03-04T20:02:34.570 回答