2016-12-05 5 views
1

ユーザー入力に基づいて範囲内の乱数を生成しようとしていますが、私がそれを実行するときに指定された範囲の。下の例では、私は8を入力し、 'puts ex_val'は247.5を返します。 8は私に170.001よりも高い何も与えてはいけません、ここで私は間違っていますか?入力に基づいて範囲内の乱数を生成しようとすると、範囲外の数値を返します

class Example 

    print "Input number between 1-12: " 
    example_range = gets.chomp 

    if example_range = 11 || 12 
    ex_val = rand(212.502..255) 
    elsif example_range = 9 || 10 
    ex_val = rand(170.002..212.501) 
    elsif example_range = 7 || 8 
    ex_val = rand(127.5..170.001) 
    elsif example_range = 5 || 6 
    ex_val = rand(84.999..127.499) 
    elsif example_range = 3 || 4 
    ex_val = rand(42.499..84.998) 
    elsif example_range = 1 || 2 
    ex_val = rand(0..42.498) 
    end 

    puts ex_val.round(1) 

end 

私はそうのような「とき」の代わりに、if文使ってみました:

case example_range  
when 11, 12 
    ex_val = rand(212.502..255) 
... 
end 

が、常にちょうど元の入力を返すように見えたことを。

+1

出力は何ですか? btw、これには本当にクラスが必要ですか? - )) – marmeladze

+1

私はおそらくそうではありません。これはトラブルシューティングの際に試した多くの事の一つです。これは3つの同様の部分の1つですが、わかりやすくするために投稿しています。 – Lacomus

答えて

1

if example_range = 11 || 12

11が割り当てられexample_range変数で、その結果、割り当てです。この条件がtruthyあるので は、あなたのプログラムは、さらに行くと、比較のために使用されている

rand(212.502..255) 

ダブル等号(==)を返していません。あなたは

if [11, 12].include?(example_range) 

P.S.のようなものを使用したいあなたのケースで

example_range = gets.chomp 

Stringオブジェクトではなく、整数を返します - あなたは、整数と比較する前に(to_iを使用して)example_rangeを変換する必要があります。

+2

もちろん、 'example_range == 11 || example_range == 12'! –

+0

私はKen Y-Nの修正をこれと同様に使用しましたが、現在はNil:NilClass(NoMethodError)の "未定義メソッド' round 'を取得しています。 – Lacomus

+1

to_iはそれを修正しました!ありがとうございました – Lacomus

0

あなたのコードは2つの理由では動作しません:

  • まず=アンドレイDeinekoなどのない比較は、すでに説明した割り当てです。
  • 第2 gets.chompは、整数ではない文字列を返します。ユーザーの入力を整数と比較しようとすると、コンディション以外のものが真である可能性があります。

さらに、if ..elsifブロックのリファクタリングをハッシュ検索に提案したいと考えています。 IMOを使用すると、読みやすく、理解し、管理しやすくなります。

fraction = (255/6.to_f) 
ranges = { 
    '1' => ((fraction * 0)...(fraction * 1)), 
    '2' => ((fraction * 0)...(fraction * 1)), 
    '3' => ((fraction * 1)...(fraction * 2)), 
    '4' => ((fraction * 1)...(fraction * 2)), 
    '5' => ((fraction * 2)...(fraction * 3)), 
    '6' => ((fraction * 2)...(fraction * 3)), 
    '7' => ((fraction * 3)...(fraction * 4)), 
    '8' => ((fraction * 3)...(fraction * 4)), 
    '9' => ((fraction * 4)...(fraction * 5)), 
    '10' => ((fraction * 4)...(fraction * 5)), 
    '11' => ((fraction * 5)..(fraction * 6)), 
    '12' => ((fraction * 5)..(fraction * 6)) 
} 

print 'Input number between 1-12: ' 
range = gets.chomp 

puts rand(ranges[range]).round(1) 
関連する問題