【发布时间】:2011-08-26 01:37:55
【问题描述】:
我正在尝试使用 Ruby 获得 1900 年到 1980 年之间的随机年份。
到目前为止我有:
puts 'the year was: ' + 1900.to_s + rand(1980).to_s
但这只是将 1900 和 0 - 1979 之间的随机数相加,看起来像 19001947。
我认为我遗漏了一些愚蠢的东西,但任何人都可以解释一下吗?
【问题讨论】:
标签: ruby
我正在尝试使用 Ruby 获得 1900 年到 1980 年之间的随机年份。
到目前为止我有:
puts 'the year was: ' + 1900.to_s + rand(1980).to_s
但这只是将 1900 和 0 - 1979 之间的随机数相加,看起来像 19001947。
我认为我遗漏了一些愚蠢的东西,但任何人都可以解释一下吗?
【问题讨论】:
标签: ruby
Ruby 1.9.3
1.9.3p0 :001 > rand(1900..1980)
=> 1946
1.9.3p0 :002 > rand(1900..1980)
=> 1929
1.9.3p0 :003 > rand(1900..1980)
=> 1934
【讨论】:
试试看
(1900 + rand(81)).to_s
路人一目了然
首先,存在关于字符串连接的问题。问题中的原始代码是将两个字符串(包含数字)连接在一起。示例:
“1900”+“1920”=“19001920”
其次,生成的随机数范围存在问题。在这种情况下,由于我们只想要 80 年的范围,我们想要使用 rand(81),而不是 rand(1980)。然后我们把这个结果加到基数上,这将给我们一个介于 1900 和 1980 之间的随机数。
【讨论】:
puts "The year was #{1900 + rand 81}"
【讨论】:
是的:你得到了 + 的“字符串连接”重载。试试(1900+rand(80)).to_s
【讨论】:
Ruby 1.8+
(1900..1980).to_a[rand(80)]
# or little more Rubyistic
(1900..1980).to_a.shuffle.first
Ruby 1.9+
[*1900..1980].sample
【讨论】:
0..1_000_000_000 可能会很痛苦。