如何获得随机的0和1数字

Del*_*lta 5 ruby random loops

所以基本上为了好玩,我试图生成一列数字(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
Run Code Online (Sandbox Code Playgroud)

我的问题是,不是生成0和1的随机列,而是使用所有数字.

tsm*_*tsm 12

这是惯用的Ruby:

5.times do
  puts (1..7).map { [0, 1].sample }.join
end
Run Code Online (Sandbox Code Playgroud)

我们打开包装:

5.times do...end很明显是不言自明的.做什么之间的doend五倍.

(1..7)生成一个包含七个元素的数组.我们现在并不关心它里面有什么.map返回一个新数组,其中每个元素都是调用大括号之间的结果.所以七次我们会调用[0, 1].sample并将结果压缩成一个数组.的sample本身,当然,随机选取任一01.最后.join将数组转换为字符串..join('-')例如,如果我们说,它会在每个元素之间加一个连字符(1-0-0-1-1-1-0-1).但由于我们没有指定任何内容,因此它不会在每个元素之间放置任何内容(10011101).

你有它.

正如其他人所指出的那样,对于这个特殊问题,可以通过使用二进制来做更快更短的事情.我不认为这是Ruby Way.关于速度,"过早优化是所有邪恶的根源",如果你对慢速代码有强烈反感,那么你不应该编写Ruby.关于可读性,这种方式可能更短,但上述方式更清晰."哦,我们做了五次,这将打印出7个长的...... 0和1的随机序列......作为一个字符串".它几乎像英语(如果你知道单词map(定义三)).

  • 严格地说,`(1..7)`不生成数组,因为它是仅由端点组成的范围.直到在创建数组的范围内调用`map`时,才会填充````````````````````````````````````````````````` (2认同)

Ry-*_*Ry- 10

解决此问题的最佳方法可能是进行基本转换:

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

puts someNumber.to_s(2).ljust(7, '0') # 10110100, e.g.
Run Code Online (Sandbox Code Playgroud)