【问题标题】:Interesting task using random numbers only [closed]仅使用随机数的有趣任务[关闭]
【发布时间】:2010-05-26 10:20:56
【问题描述】:

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

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

【问题讨论】:

  • 请澄清:'构造一个小数部分为零的浮点数'是什么意思?这是作业问题吗?如果是这样,请标记为这样。
  • @phisodelia 你自己有答案吗?
  • 我不认为这是通常。
  • 我对@9​​87654321@的要求有点疑惑。您应该如何在不使用变量的情况下执行(有用的)for 循环?
  • 如果我在求职面试中被问到这样一个奇怪的问题,我会找借口离开。

标签: python c algorithm math random


【解决方案1】:

在 Python 中:

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

但毫无疑问,我会被告知这违反了这个奇怪问题的一些不成文的、尚未公开的条件。

【讨论】:

  • 恭喜,这是正确的解决方案。
  • 我以为你说没有类型转换,这不是将布尔表达式 (-random() > random()) 转换为浮点数吗?
  • 其中肯定存在隐式转换(从技术上讲,这可能与演员表相同,也可能不同,具体取决于我们应该谈论的是哪种语言)。
  • 叹息,所以整个问题是关于您是否认识到强制转换是一种显式类型转换,而让隐式转换 - 强制 - 免费使用。我在这个问题上称其为完全虚假,因为该解决方案仅适用于支持强制转换的语言,包括从布尔假到真正零的强制!
  • @High Performance Mark:违反了哪个要求?这里没有强制转换:无论是在 C 中还是在 Python 中,隐式转换都不是强制转换。
【解决方案2】:

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

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

如果我有更多的时间和倾向,我希望我可以证明 N 个浮点数(或双精度数)的乘积在 IEEE 算法下会变为 0。因为我玩过 Matlab,N == 800 似乎就足够了。

编辑:OP 坚持避免使用所有常量和变量,这使我想到了这个解决方案:

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

我会让你免去所有其他 797 电话的随机性。对于所有因这个令人难以置信的荒谬解决方案而头骨碎裂的人,我可以向您指出这个问题。

免得你怀疑或担心,我不知道 random() 在你的语言中返回什么,在我的伪代码中,它返回一个浮点数,其位数为我希望的位数(32、64、157,如果我want) 在 [0,1] 范围内根据需要。

【讨论】:

  • 您不能在算法中使用任何常量。
  • 为了避免N,x = rand(); while (x) x *= rand();怎么样?
  • @mtrw: 你的 x 对我来说就像一个变量,@psihodelia 非常严格
  • 这不起作用,因为理论上对 random() 的前 799 次调用可能会返回 1,最后一次在 0.5 时
  • @Andreas Brinck:没有软件是没有错误的。该程序有一个错误:每 10000000000 年一次,它不会给出正确的结果。我会说这是一个非常好的软件。
【解决方案3】:

这里有一个 Python 解决方案:

from random import random

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

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

使用示例:

>>> zerofraction()
0.0

【讨论】:

  • 如果前两个random()返回0和最后一个0.5会怎样
  • 这有什么意义?它返回 random() 的值的机会很小但有限,否则返回 0。
  • 好点,没有考虑前两个 random() 调用都返回零的情况。
  • 更新了解决方案。这个应该是防弹的。
  • 看起来positiverandom 可能导致无限递归。
【解决方案4】:
return ceil(random())

有效。

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

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

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

【讨论】:

  • 你不能使用任何函数,只能使用random()。
  • Aww...我为你感到非常兴奋 sdcvvc。现在我不得不收回一切,再次开始绝望。我仍然认为它足够聪明。
  • psihodelia,请列出所有允许的“其他编程语言操作数”和算术运算。实数是否准确表示并且 random() 是真正的 RNG?否则就是xkcd.com/169这样的猜谜游戏
  • 我觉得我们只是被串通了,我有一种感觉,当 psihodelia 最终给出他的答案时,我会非常非常失望......
  • random() 是常用的 C 函数,它从 [0,1] 返回一个浮点数。你可以使用任何你喜欢的编程结构,但你不能使用任何库函数,只能使用 random()。
【解决方案5】:
 float random_float() {
     return 1.0;   /* chosen by random sphere roll, guaranteed to be random */
 }

【讨论】:

  • +1 供参考 :-)
【解决方案6】:

我们开始吧!

<?php

random();

function random() {
    return 1.0;
}

只要我能讲故事,1.0 是区间 [0, 1] 中的随机数之一是完全正确的。

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

【讨论】:

  • PHP 确实有 rand()。而 1.0 是一个常数!
  • rand() 不返回浮点数,我在回答中解释了常量。
  • 不要作弊! ;) 你return 1.0 所以你使用一个常量!!! :)
【解决方案7】:
float random_float() {
     return random(); // POSIX random returns a long.
} //  I assume that's what OP means, no indication otherwise.

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

上面确实包含一个类型转换,但是如果不使用浮点常量 0.1. 或来自 FP 值函数的值(@987654324),则无法构造浮点数@ 不是。

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

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

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

【讨论】:

  • 但是有一个规范,它们应该是整数
  • 那不会生成一个小数部分为 0 的数字,是吗?
  • @nico:规范是小数部分的 0。 @jk:是的,random 产生一个整数。见man random
  • 如果问题中提到的随机数是您正在投射的 posix 随机数,如果它是 [0,1] 范围内的实数 [原文如此],那么您不会产生整数
【解决方案8】:
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 numbers AND 0 &lt; a,b &lt; 1

然后是a*b &lt; 1a*b &lt; aa*b &lt; b.

因此,答案将始终为零。那么为什么不直接返回 0.00。

证明:

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

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

【讨论】:

  • 你正在使用一个常量:ZERO
  • 同样在问题陈述中它说数字在[0, 1]范围内,而不是(0, 1)范围内。
【解决方案9】:

将所有实数的 FP 表示按位和在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2012-06-19
    • 2016-09-02
    • 2017-06-11
    • 2023-03-25
    相关资源
    最近更新 更多