给定区间[0,1]中任意数量的随机实数,是否存在构造零分数部分的浮点数的任何方法?
您的算法只能使用random()函数调用,不能使用变量或常量。不允许使用常量和变量,不允许类型转换。您可以使用for / while,if / else或任何其他编程语言操作数。
答案 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,b
是real numbers
和0 < a,b < 1
然后a*b < 1
,a*b < a
和a*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表示。