所以基本上为了好玩,我试图生成一列数字(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很明显是不言自明的.做什么之间的do和end五倍.
(1..7)生成一个包含七个元素的数组.我们现在并不关心它里面有什么.map返回一个新数组,其中每个元素都是调用大括号之间的结果.所以七次我们会调用[0, 1].sample并将结果压缩成一个数组.的sample本身,当然,随机选取任一0或1.最后.join将数组转换为字符串..join('-')例如,如果我们说,它会在每个元素之间加一个连字符(1-0-0-1-1-1-0-1).但由于我们没有指定任何内容,因此它不会在每个元素之间放置任何内容(10011101).
你有它.
正如其他人所指出的那样,对于这个特殊问题,可以通过使用二进制来做更快更短的事情.我不认为这是Ruby Way.关于速度,"过早优化是所有邪恶的根源",如果你对慢速代码有强烈反感,那么你不应该编写Ruby.关于可读性,这种方式可能更短,但上述方式更清晰."哦,我们做了五次,这将打印出7个长的...... 0和1的随机序列......作为一个字符串".它几乎像英语(如果你知道单词map(定义三)).
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)