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是不言自明的。做任何介于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(定义三))。

于 2012-06-20T02:11:18.753 回答
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.
于 2012-06-20T02:03:55.017 回答
2

@minitech 答案的推导

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

Ruby 无法从您的rand()输入中理解您需要特定格式的数字。

取而代之的是随机生成每个数字 ( rand(2)) 并用这样的七个变量构建整个数字。在自己的一行上打印结果,然后重新启动循环。

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

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

于 2012-06-20T02:04:10.203 回答
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"]
于 2012-06-20T12:19:51.423 回答