在Java中获取随机布尔值

88

好的,我已经将这个stackoverflow问题实现到我的代码中:Return True or False Randomly

但是,我遇到了奇怪的行为:我需要同时运行十个实例,每个实例每次运行只返回一次true或false。而令人惊讶的是,无论我做什么,每次都只得到false

有什么方法可以改进这种方法,以便我至少有大约50%的机会获得true吗?


为了更加易于理解:我将我的应用程序构建为JAR文件,然后通过批处理命令运行。

 java -jar my-program.jar
 pause

程序内容 - 为了尽可能简单:

public class myProgram{

    public static boolean getRandomBoolean() {
        return Math.random() < 0.5;
        // I tried another approaches here, still the same result
    }

    public static void main(String[] args) {
        System.out.println(getRandomBoolean());  
    }
}

如果我打开10个命令行并运行它,每次都会得到结果为false...


31
http://xkcd.com/221/ - aioobe
15
为什么不使用 Random r = new Random(); r.nextBoolean(); - Thomas Jungblut
11个回答

0

你可以获取你的clock()值,并检查它是奇数还是偶数。我不知道它是否真正的50%。

而且你可以自定义创建你的随机函数:

static double  s=System.nanoTime();//in the instantiating of main applet
public static double randoom()
{

s=(double)(((555555555* s+ 444444)%100000)/(double)100000);


    return s;
}

数字55555..和444..是获取广泛范围函数的大数值,请忽略那个Skype图标:D


你可能无法获得真正的 CPU 循环,但可以获得低分辨率的时钟周期。然后你就有了一个误差范围,在每次获取 clock() 值时都会有随机点。如果误差范围是对称的,则在统计上必须为 50%。 - huseyin tugrul buyukisik
他并没有要求双重生成器,所以你发布的代码片段相当无关紧要。其次,检查当前时间是否为偶数不是一个好主意,原因有几个。System.nanoTime()不能保证纳秒级别的精度。我的只有微秒级别的精度。因此,它总是偶数-->总是真实的。其次,如果在短时间内多次调用随机函数,则生成的随机值将取决于先前的值。如果您使用currentTimeMillis()并在每毫秒调用100次随机生成器,则生成器将连续产生100个true。 - Alderath
如果一直是真的,那么它就没有偏差。bit=(boolean)s; 如果你需要随机性,你将需要随机误差范围。误差就像随机事件一样,是无法预料的行为。这就是为什么我故意使用System.nanoTime()来获取误差范围。但你对System.nanoTime()的缓慢性是正确的,这就是为什么它被用作“种子”的原因。然后randoom()尽可能快地被计算机使用。 - huseyin tugrul buyukisik
我的意思是,尽管它不符合我之前评论的字数限制,但最好使用Java内置的随机函数,而不是基于未经调查的假设构建自己的临时随机实现。 - Alderath
以防万一他不喜欢这些库。也许他的Java版本有一些错误或损坏。我不知道。我只是说出了我所知道的。 - huseyin tugrul buyukisik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接