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

时间:2012-06-20 01:58:09

标签: ruby loops random

所以基本上为了好玩,我试图生成一列数字(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 ,而是使用数字。

5 个答案:

答案 0 :(得分:12)

这是惯用的Ruby:

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

让我们打开它:

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 :(得分: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))并从这七个变量中构建整个数字。将结果打印在自己的行上,然后重新启动循环。

另一种选择是在0127之间生成一个随机数,然后将其格式化为二进制输出。这在随机数生成器中花费的时间少得多,并且大大减少了程序中的变量。

任何一种方法都适合学习计划。试试两者,看看你喜欢哪个版本。试着理解为什么你喜欢一种方式而不是另一种方式。

答案 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"]