有趣的任务只使用随机数

时间:2010-05-26 10:20:56

标签: python c algorithm math random

给定区间[0,1]中任意数量的随机实数,是否存在构造零分数部分的浮点数的任何方法?

您的算法只能使用random()函数调用,不能使用变量或常量。不允许使用常量和变量,不允许类型转换。您可以使用for / while,if / else或任何其他编程语言操作数。

9 个答案:

答案 0 :(得分:4)

最好我到目前为止:生成一个N个随机数的列表,将它们全部相乘,当N足够大时,它将变为0(其中有0个小数部分)。

好的,我使用了变量(N),但我不确定如何使用for循环或if语句没有变量或常量。

如果我有更多的时间和倾向,我希望我可以证明在IEEE算术下N浮点数(或双数)的乘积将变为0。因为我是用Matlab玩的,N == 800似乎已经足够了。

编辑:OP坚持避免所有常量和变量,这使我接下来解决这个问题:

random() * random() * random() * ...

我会随便给你所有其他797个电话。对于那些头脑在这种令人难以置信的荒谬解决方案中分裂的人,我可以指出你的问题。

为免你想知道或担心,我不知道random()在你的语言中返回什么,这里在我的伪代码中它返回一个浮点数,其数量与我想要的一样多(32,64,157如果我根据需要在[0,1]范围内。

答案 1 :(得分:4)

这是Python的解决方案:

from random import random

def positiverandom():
    return random() or positiverandom()

def zerofraction():
    return (positiverandom() == -positiverandom()) * random()

用法示例:

>>> zerofraction()
0.0

答案 2 :(得分:4)

return ceil(random())

作品。

如果你只允许像+, - ,*,sin这样的运营商你可以证明:

  

使用U [0,1]中的随机变量和算术运算构建的每个表达式,使用每个随机变量一次将表示概率为1的无理数。

由于您的程序必须以return expression结尾,因此概率为1(或不会停止)是错误的。

答案 3 :(得分:4)

在Python中:

>>> (-random() > random())*random()
0.0

但毫无疑问,我会被告知这违反了这个奇怪问题的一些不成文的,尚未透露的情况。

答案 4 :(得分:2)

 float random_float() {
     return 1.0;   /* chosen by random sphere roll, guaranteed to be random */
 }

答案 5 :(得分:1)

我们走了!

<?php

random();

function random() {
    return 1.0;
}

只要我能说出1.0是正确的区间[0,1]中的随机数之一。

我没有使用常量!我的算法是对random()的调用,而不是random()的实现。 PHP恰好没有这样的功能所以我必须自己做,方便。

答案 6 :(得分:0)

float random_float() {
     return random(); // POSIX random returns a long.
} //  I assume that's what OP means, no indication otherwise.

考虑到你甚至没有指定返回的浮点数应该是随机的,更不用说它们应该具有的分布,我认为这是我们能做的最好的。

上面确实包含了一个类型转换,但是如果没有使用浮点常量0.1.或FP值函数的值,就无法构造浮点数,random不是。

作弊(这会产生不同的分布并且相当不稳定):

float random_float() {
     if ( random() < random() ) {
         return expf( float() ) + random_float();
     } else return expf( float() ); // expf(float()) just a fancy name for 1
}

顺便说一句,实际的实际数字超出了计算机的掌握范围。输入一个将花费无限的时间。

答案 7 :(得分:0)

list_of_random_real_numbers = [.....]; // LoRRN

for n in LoRRN:
    LoRRN[0] = LoRRN[0] * n;

while(fractional part of LoRRN[0] is not ZERO) 
      LoRRN[0] = LoRRN[0]* LoRRN[0]

print LoRRN[0]

因为a,breal numbers0 < a,b < 1

然后a*b < 1a*b < aa*b < b.

因此,答案总是为零。那么为什么不返回0.00。

<强> PROOF:

0<a,b<1 and m,n >1

a = 1/m and b = 1/n 

a*b = 1/(m*n) 

=> 0 < a*b < a,b < 1

但由于我们在一些乘法后使用浮点运算,因此数字会很小,以至于计算机将其视为零。

答案 8 :(得分:0)

按位和所有实数的FP表示。