【问题标题】:How to get random 0 and 1 numbers如何获得随机的 0 和 1 数字
【发布时间】:2012-06-22 03:15:04
【问题描述】:

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

【问题讨论】:

  • 创建一个空字符串。一次生成一个数字,如 rand(0-1),并将其附加到最初为空的字符串中。尽可能多地执行此操作。如果不以某种方式告诉语言,您就不能以这种方式处理小数。很抱歉,我无法为您编写代码 - 我没有安装 ruby​​ 实现...
  • 你查过随机函数是如何工作的吗?还有减法?和循环终止?
  • 如果您可以轻松打印二进制,您可以生成 0-127 的数字并打印它们的二进制形式。
  • @Morten 告诉你一个秘密——我实际上使用的是 repl.it 网站;)
  • @Dave 是的,我确实对它们都不熟悉,但我可以使用它们

标签: ruby loops random


【解决方案1】:

这是惯用的 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这个词(定义三))。

【讨论】:

  • 我想这取决于问题陈述和程序存在的原因。当我听说要生成七个01 数字时,我只能想到0..127 的表示,所以这对我来说是最自然的。你聪明的(1..7) 避免了在幼稚代码中使用的变量的可怕扩散——并教授了制作一个快速丢弃的匿名数组的有用工具。
  • 您的版本会更容易扩展到 N 列 a7 字符 -- 但 minitech 的版本对我来说感觉更自然如果问题与 number 表示密切相关。
  • 这是我使用的此代码的修改版本(有时它会生成随机 ASCII 艺术 :D)code5.times do puts (1..7).map { rand(2) } .join endcode
  • 严格来说,(1..7) 不会生成数组,因为它是一个仅包含端点的范围。直到在范围上调用 map 才会创建一个数组,其中填充了通过在范围上调用 each 产生的元素的 maps 转换。
  • +1,这是一个更好的解决方案。 (并且二进制部分不是为了优化 - 我只是认为这会更长(事实并非如此)(但这部分是因为我尝试了另一种方式)。)
【解决方案2】:

解决这个问题的最好方法可能是进行基础转换:

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

puts someNumber.to_s(2).ljust(7, '0') # 10110100, e.g.

【讨论】:

  • @DGM:我有真的大手指;)
  • 幸运的是,我得到了“0000”的输出:D
  • 很好地使用位移来减少只是说 128 的幻数。
  • @Linuxios:OP本质上是想得到一个随机的二进制数;而且它一点也不 hacky =)
  • @minitech:这并不意味着我不喜欢它;)。 +1。我喜欢涉及比特的东西。让我印象深刻的是,这是您的想法,而不是一些字符串附加循环业务。
【解决方案3】:

@minitech 答案的推导

 5.times { puts "%07b" % rand(128) }

【讨论】:

    【解决方案4】:

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

    而是随机生成每个数字 (rand(2)) 并用这样的七个变量构建整个数字。将结果单独打印在一行上,然后重新开始循环。

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

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

    【讨论】:

    • 有人能告诉我如何做选项 2 吗?
    • Minitech's answer 已经很好地涵盖了这一点。 :) 没想到将数字转换成二进制这么简单to_s(2)
    【解决方案5】:

    这是一种生成任意数量(默认为 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"]
    

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2013-09-11
      • 2014-03-02
      • 1970-01-01
      • 2015-01-08
      • 2019-05-02
      • 2018-09-26
      • 2022-05-31
      相关资源
      最近更新 更多