代码之家  ›  专栏  ›  技术社区  ›  psihodelia

仅使用随机数的有趣任务[关闭]

  •  -4
  • psihodelia  · 技术社区  · 15 年前

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

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

    9 回复  |  直到 15 年前
        1
  •  4
  •   Mark Dickinson Alexandru    15 年前

    在蟒蛇中:

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

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

        2
  •  4
  •   High Performance Mark    15 年前

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

    好的,我使用了一个变量(n),但是我不知道如何使用for循环或者没有变量或常量的if语句。

    如果我有更多的时间和倾向,我希望我能证明n个浮点数(或双精度浮点数)的乘积在ieee算法下会变为0。我用matlab玩过,n==800就足够了。

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

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

    其他797个电话我都不打给你。对于你们所有的人来说,他们的头骨在这个令人难以置信的荒谬的解决方案中裂开了,我可以向你们指出这个问题吗?

    为了避免你疑惑或担心,我不知道random()在你的语言中返回了什么,在我的伪代码中,它返回了一个浮点数字,根据需要,它包含了任意多的位(32,64,157,如果我需要的话)在范围[0,1]内。

        3
  •  4
  •   Pär Wieslander    15 年前

    下面是Python中的一个解决方案:

    from random import random
    
    def positiverandom():
        return random() or positiverandom()
    
    def zerofraction():
        return (positiverandom() == -positiverandom()) * random()
    

    使用实例:

    >>> zerofraction()
    0.0
    
        4
  •  4
  •   sdcvvc    15 年前
    return ceil(random())
    

    作品。

    如果只允许+、-、*等运算符,则可以证明:

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

    因为你的节目必须以 return expression 它将是错误的(或不会停止),概率为1。

        5
  •  2
  •   Alnitak    15 年前
     float random_float() {
         return 1.0;   /* chosen by random sphere roll, guaranteed to be random */
     }
    
        6
  •  1
  •   erisco    15 年前

    我们走吧!

    <?php
    
    random();
    
    function random() {
        return 1.0;
    }
    

    只要我能告诉这个故事,1.0是间隔中非常正确的随机数之一[0,1]。

    我没有使用常量!我的算法是调用 random() ,而不是执行 随机化() . PHP恰好没有这样的功能,所以我必须自己制作,方便。

        7
  •  0
  •   Potatoswatter    15 年前
    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
    }
    

    顺便说一下,实际的实数是计算机无法掌握的。输入一个需要无限的时间。

        8
  •  0
  •   Pratik Deoghare    15 年前
    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呢?

    证明:

    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
    

    但是,正如我们在使用浮点运算后,一些被乘数将是如此之小,计算机将它作为零。

        9
  •  0
  •   Vicky    15 年前

    位和fp一起表示所有实数。