6

だから基本的に楽しみのために私は数字の列を生成しようとしていました(7桁は0と1のみ)私のコードはかなり短いです:

a = rand(0000000-1111111)
b = 220
a1 = rand(0000000-1111111)
a2 = rand(0000000-1111111)
a3 = rand(0000000-1111111)
a4 = rand(0000000-1111111)
a5 = rand(0000000-1111111)

while b !=0
  puts a
  puts a2
  puts a3
  puts a4
  puts a5
end

私の問題は、0と1のランダムな列を生成する代わりに、すべての数値が使用されることです。

4

5 に答える 5

12

これが慣用的なRubyです:

5.times do
  puts (1..7).map { [0, 1].sample }.join
end

それを開梱しましょう:

5.times do...endかなり自明です。doend5回の間で何でもします。

(1..7)7つの要素を持つ配列を生成します。現在、実際に何が含まれているのかは気にしません。map各要素が中括弧の間にあるものを呼び出した結果である新しい配列を返します。したがって、7回呼び出し[0, 1].sampleて、結果を配列に絞り込みます。もちろん、それsample自体はランダムにまたはのいずれ0かを選択します1。最後.joinに、配列を文字列に変換します。たとえば.join('-')、たとえば、各要素の間にハイフンを入れます(1-0-0-1-1-1-0-1)。ただし、何も指定しなかったため、各要素(10011101)の間に何も配置されません。

そして、あなたはそれを持っています。

他の人が指摘しているように、この特定の問題では、バイナリを使用することで、より速く、より短いことを行うことができます。しかし、これはRubyWayではないと思います。速度に関しては、「時期尚早の最適化はすべての悪の根源です」。スローコードを激しく嫌う場合は、とにかくRubyをコーディングするべきではありません。読みやすさに関しては、その方法は短いかもしれませんが、上記の方法ははるかに明確です。「ああ、私たちは5回何かをしている、そしてそれは7もの長さ...0と1のランダムなシーケンス...文字列として出力するだろう」。それはほとんど英語のように読めます(あなたが単語マップ(定義3)を知っているなら)。

于 2012-06-20T02:11:18.753 に答える
10

The best way to solve this is probably to do base conversion:

someNumber = rand(1 << 7) # Seven digits, max; 1 << 7 is 10000000 in binary.

puts someNumber.to_s(2).ljust(7, '0') # 10110100, e.g.
于 2012-06-20T02:03:55.017 に答える
2

@minitechの回答の導出

 5.times { puts "%07b" % rand(128) }
于 2012-06-20T06:14:57.997 に答える
1

指定された長さの任意の数 (デフォルトは 1) の 2 進数を生成するメソッドを次に示します。

def random_binary(length, n=1)
  raise ArgumentError if n < 1
  (1..n).map { "%0#{length}b" % rand(2**length) }
end

random_binary(7, 5)
#=> ["0011100", "1001010", "0101111", "0010101", "1100101"]
于 2012-06-20T12:19:51.423 に答える
1

Ruby does not understand from your rand() inputs that you want specifically-formatted numbers.

Instead generate each digit randomly (rand(2)) and build the entire number out of seven variables like this. Print the result on a line of its own then restart the loop.

Another option is to generate a random number between 0 and 127 and then format it for binary output. This spends much less time in the random number generator and drastically reduces the variables in your program.

Either approach is just fine for a learning program. Try both and see which version you prefer. Try to understand why you prefer one way over another.

于 2012-06-20T02:04:10.203 に答える