所以基本上为了好玩,我试图生成一列数字(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的随机列 all ,而是使用数字。
答案 0 :(得分:12)
这是惯用的Ruby:
5.times do
puts (1..7).map { [0, 1].sample }.join
end
让我们打开它:
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(定义三))。
答案 1 :(得分: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.
答案 2 :(得分:2)
推导@minitech的回答
5.times { puts "%07b" % rand(128) }
答案 3 :(得分:1)
Ruby无法从您的rand()
输入中了解您想要特定格式的数字。
而是随机生成每个数字(rand(2)
)并从这七个变量中构建整个数字。将结果打印在自己的行上,然后重新启动循环。
另一种选择是在0
和127
之间生成一个随机数,然后将其格式化为二进制输出。这在随机数生成器中花费的时间少得多,并且大大减少了程序中的变量。
任何一种方法都适合学习计划。试试两者,看看你喜欢哪个版本。试着理解为什么你喜欢一种方式而不是另一种方式。
答案 4 :(得分:1)
这是一个生成指定长度的二进制数的任意数(默认值为1)的方法:
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"]