2012-06-20 42 views
5

所以基本上为了好玩,我试图产生一列数字(7个位数只有0和1) 我的代码的很短:如何获得随机的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的随机列全部使用数字。

+0

使一个空字符串。一次生成一个数字,例如rand(0-1),并将其追加到最初为空的字符串中。尽可能多的数字,你想要的数字。不能以这种或那种方式告诉语言,你不能以这种方式处理小数。对不起,我不能为你做代码 - 我没有安装ruby实现... –

+0

你看过随机函数的工作原理吗?和减法?和循环终止? –

+2

如果您可以轻松打印二进制文件,则可以从0-127生成数字并打印它们的二进制格式。 – nhahtdh

回答

12

这里的idiomaticish红宝石:

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

让我们来解开它:

5.times do...end是不言自明。在doend之间做五次。

(1..7)生成一个包含7个元素的数组。我们实际上并不关心它里面的内容。 map返回一个新的数组,其中每个元素是调用大括号之间的内容的结果。所以七次我们将调用[0, 1].sample并将结果压缩到一个数组中。当然,sample本身随机选择01。最后.join将数组变成一个字符串。例如,如果我们说.join('-'),它会在每个元素之间加一个连字符(1-0-0-1-1-1-0-1)。但是由于我们没有指定任何东西,它不会在每个元素之间放置任何东西(10011101)。

而你有它。

正如其他人已经指出的那样,对于这个特定的问题,可以通过使用二进制来做更快更短的事情。尽管我认为这不是Ruby途径。就速度而言,“不成熟的优化是所有邪恶的根源”,如果您对暴力缓慢的代码有暴力反感,那么无论如何您都不应该编写Ruby。关于可读性,这种方式可能会更短,但上述方式更清晰。 “哦,我们做了五次,这将会打印出一个长度为7的......随机的0和1的序列......作为一个字符串”。它几乎像英语(如果你知道单词map(定义三))。

+0

我想这取决于问题陈述和程序存在的_reason_。当我听说要生成七个'0'或'1'数字时,我只能想到'0..127'的表示,所以它对我来说是最自然的。你聪明的'(1..7)'避免了那些用在幼稚代码中的变量的可怕扩散 - 并教导了制作一个很快被丢弃的匿名数组的有用工具。 – sarnold

+0

您的版本将会更容易_extend_到N列'a','7'和'€'字符 - 但如果问题与_number_表示紧密相关,minitech的版本会更加自然。 – sarnold

+0

下面是我使用的这段代码的一个修改版本(有时它会生成随机的ASCII码:D)'code'5.times puts puts(1..7).map {rand(2)} .join end'code ' – Delta

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. 
+0

为什么ljust 4而不是7? – DGM

+0

@DGM:我有*真的*大手指;) – Ryan

+0

幸运的是,我得到了一个“0000”的输出:D – DGM

1

Ruby没有从要专门格式的数字你rand()输入明白。

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

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

这两种方法都适用于学习计划。试试看看你喜欢哪个版本。试着去理解为什么你更喜欢某种方式。

+0

有人可以告诉我如何做选项2? – Delta

+0

[Minitech的回答](http://stackoverflow.com/a/11111899/377270)有很好的报道。 :)我不希望将数字转换为二进制,就像'to_s(2)'一样简单。 – sarnold

2

推导@ MiniTech移动的回答

5.times { puts "%07b" % rand(128) } 
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"]