Ruby:rand方法并没有给我一个真正随机的数字

时间:2013-12-03 15:54:04

标签: ruby random

我试图回答Chris Pine的“学习编程”一书中的以下问题:

  

•写一个聋人奶奶计划。无论你对奶奶说什么(无论如何   你输入),她应该回答HUH ?!说起来,SONNY !,除非   你喊它(输入所有大写字母)。如果你喊,她可以听到你的声音   (或至少她这么认为)然后大喊大叫,不,不是从1938年开始!至   让你的节目真的可信,让奶奶大喊大叫   一年一次;也许在1930年到1950年之间随意的任何一年。(这   部分是可选的,如果您阅读本节,将会更容易   Ruby方法章节末尾的随机数生成器。)   在你喊BYE之前,你不能停止和奶奶说话。提示:不要   忘记chomp!输入的'BYE'与'BYE'不同   没有一个!提示2:尝试考虑程序的哪些部分   应该一遍又一遍地发生。所有这些应该在你的   while loop。

     

•延长你的聋奶奶计划:奶奶不要你怎么办?   离开?当你喊BYE时,她可以假装不听你的声音。   更改以前的程序,以便您必须三次喊BYE   连续。确保测试你的程序:如果你大喊BYE三   时间,但不是连续,你还应该和奶奶说话。

当我运行它时,我的代码给了我相同的“random_year”。为什么代码没有给我一个实际的随机年份(1930年到1950年之间)?

红宝石中的代码。

# Deaf Grandma

random_year = 1930 + rand(1950 - 1930)

puts 'WHAT DO YOU WANT KID?'

bye = 0
talk_to_grandma = nil

while bye < 3 
  talk_to_grandma = gets.chomp
  if talk_to_grandma == "BYE"
    puts 'NO, NOT SINCE ' + random_year.to_s
    bye+=1
    elsif talk_to_grandma == talk_to_grandma.upcase
      puts 'NO, NOT SINCE ' + random_year.to_s 
      bye = 0
    else  
      puts "HUH?! SPEAK UP, SONNY!"
      bye = 0
  end
end

3 个答案:

答案 0 :(得分:4)

您需要在循环内生成随机数。现在你在程序开始时生成它ONCE,然后它永远不会改变。基本上是:

while bye < 3 
    random_year = 1930 + rand(1950 - 1930)  // move the random generation to here
    puts 'NO, NOT SINCE ' + random_year.to_s

答案 1 :(得分:2)

您已在第一个代码行中为random_year变量指定了值。它是随机选择的。

每次致电

puts 'NO, NOT SINCE ' + random_year.to_s 

访问/读取变量,但不进行修改。

您可能希望将随机年代生成封装在方法中:

def random_year( start=1930, range = 20 )
  start + rand( range )
end

然后你可以像这样使用它:

puts "NO, NOT SINCE #{random_year}"

或者,对于年纪略大的奶奶:

puts "NO, NOT SINCE #{random_year(1910, 50)}"

答案 2 :(得分:0)

对于我已经使用过的练习:rand(1930..1950)