How do I generate a random number in a certain range with Ruby?
我想用Ruby在1900年到1980年之间随机获得一年。
到目前为止,我有:
1
| puts 'the year was: ' + 1900.to_s + rand(1980).to_s |
但这只是把1900和0-1979的随机数加在一起,看起来像19001947。
我想我错过了一些愚蠢的东西,但有人能开灯吗?
红宝石1.9
1 2 3 4 5 6
| 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" +"1920" ="19001920"
第二,有一个问题,随机数的范围正在生成。在这种情况下,因为我们只需要80年的时间范围,所以我们希望使用兰德(81),而不是兰德(1980)。然后我们得到这个结果,并把它加到基数上,这将给我们一个1900到1980年之间的随机数。
- 做得很好-非常感谢!
- 这将生成1900(有时),但不会生成1980。
- 你错了,这不是字符串类别的问题:1900.To-U和Rand(80)。To-U都对string类型的对象进行了评估,因此"+"操作实际上是"+"的字符串重载。当它变为(1900+rand(80))时,1900和rand(80)的结果是数字,然后结果和被转换成一个字符串。
- @查理,我想你读错了我对绳子的评论。我的回答是"最初的问题是连接两个字符串"。我相信我们不是同一页。引用我的回答:"首先,有一个关于字符串连接的问题。"我的意图是交流这个问题确实有两个问题,第一个问题是连接问题。
- @斯汀纠正了,谢谢。
1
| puts"The year was #{1900 + rand 81}" |
红宝石1.8 +
1 2 3
| (1900..1980).to_a[rand(80)]
# or little more Rubyistic
(1900..1980).to_a.shuffle.first |
红宝石1.9 +
- 这种方法的缺点是为范围内的每个元素创建了一个中间数组。对于小范围来说,这不是什么大问题。如0..1_000_000_000所说,大范围的辐射可能是痛苦的。
- 不,不要这样做。
- @铁皮人,我认为这是过度工程和过度优化。这里有一个特别的问题,我认为这个问题的好解决方案是:)。它是静态范围(1900年至1980年),不会发展成大范围。我相信,过度的工程是伊夫的。当然,你应该理解你所使用的任何方法的所有缺点,但是如果不是一个目标,你永远不应该在表现上使用"最快的"。
- @斯坦斯拉格,为什么?
- 是的,我更喜欢@phrogz解决方案,但在我回答之前,就显而易见的直接解决方案而言,我建议这样做只是为了好玩:d
- @因为效率低。不是调用rand,而是创建一个可能很大的数组,只是对它调用一个更复杂的随机方法(sample确保不会返回重复项)。
- @Steenslag,你说得对,但所有这些副作用对我们的话题来说都不是问题。
- "所有这些副作用对我们的话题来说都不是问题"我不同意。提供答案很重要,包括运营商现在和将来做出正确决策所需的信息。虽然您的解决方案确实适用于这个特定的问题,但由于没有给出关于该特定用途的警告,OP可能会在以后遇到麻烦。这是重要的信息传递和教学如何钓鱼。至于过度工程,我认为它是通过避免潜在的未来问题来进行防御编程的。
- @铁皮人,完全同意在我的回答中描述所有的副作用是个好主意——我的错。谢谢你的讨论
是的:你得到的是+的"字符串链接"过载。试试(1900+rand(80)).to_s。