在 Java 中获取随机布尔值

好的,我在代码中实现了这个 SO 问题: 随机返回真或假

但是,我有一个奇怪的行为: 我需要同时运行10个实例,其中每个实例每次运行只返回一次 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..。

155247 次浏览

您也可以尝试 nextBoolean()-Method

下面是一个例子: < a href = “ http://www.Tutorialspoint.com/java/util/Random _ nextboolean. htm”> http://www.tutorialspoint.com/java/util/random_nextboolean.htm

你看过 Java 文档吗?

从这个随机数生成器的序列中返回下一个伪随机、均匀分布的布尔值... ... 值 truefalse以(近似)相等的概率生成。

例如:

import java.util.Random;


Random random = new Random();
random.nextBoolean();

我建议使用 Random.nextBoolean()

也就是说,你使用的 Math.random() < 0.5也是有效的。下面是我机器上的行为:

$ cat myProgram.java
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());
}
}


$ javac myProgram.java
$ java myProgram ; java myProgram; java myProgram; java myProgram
true
false
false
true

不用说,每次都有 没有保证来获得不同的值

A)您没有使用您认为您正在使用的代码(比如编辑错误的文件)

B)您在测试时没有编译您的不同尝试,或者

C)您正在使用一些非标准的、不完善的实现。

初始化随机数生成器的最简单方法是使用无参数构造函数,例如

Random generator = new Random();

然而,在使用这个构造函数时,您应该认识到算法随机数生成器并不是真正随机的,它们实际上是生成一个固定但看起来随机的数列的算法。

您可以通过给 Random 构造函数提供“ Seed”参数来使它看起来更“随机”,您可以动态地构建这个参数,例如使用系统时间(以毫秒为单位)(这总是不同的)

为什么不使用 Random类,它有一个方法 nextBoolean:

import java.util.Random;


/** Generate 10 random booleans. */
public final class MyProgram {


public static final void main(String... args){


Random randomGenerator = new Random();
for (int idx = 1; idx <= 10; ++idx){
boolean randomBool = randomGenerator.nextBoolean();
System.out.println("Generated : " + randomBool);
}
}
}

你可以得到你的时钟()值并检查它是奇数还是偶数。我不知道这是不是百分之五十的真实

还可以自定义创建随机函数:

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

您还可以创建两个随机整数,并验证它们是否相同,这使您可以更好地控制概率。

Random rand = new Random();

声明一个范围来管理随机概率。 在这个例子中,有50% 的可能性是正确的。

int range = 2;

生成2个随机整数。

int a = rand.nextInt(range);
int b = rand.nextInt(range);

然后简单地比较返回的值。

return a == b;

我还有一门你可以用的课。 随机范围 java

Java8 : 使用与当前线程隔离的随机生成器: < a href = “ https://docs.oracle.com/javase/8/docs/api/Java/util/concurl/ThreadLocalRodd.html # nextBoolean ——”rel = “ noReferrer”> ThreadLocalRandom nextBoolean ()

与 Math 类使用的全局随机生成器一样,ThreadLocalRandom 是用内部生成的种子初始化的,这些种子可能不会被修改。在适用的情况下,在并发程序中使用 ThreadLocalRandom 而不是共享 Random 对象通常会遇到更少的开销和争用。

java.util.concurrent.ThreadLocalRandom.current().nextBoolean();

你可以使用以下方法得到一个公正的结果:

Random random = new Random();
//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;

注意: Random.nextInt (2)表示数字2是界。计数从0开始。所以我们有2个可能的数字(0和1) ,因此概率是50% !

如果你想给你的结果更多的可能性是真(或假) ,你可以调整以上如下!

Random random = new Random();


//For 50% chance of true
boolean chance50oftrue = (random.nextInt(2) == 0) ? true : false;


//For 25% chance of true
boolean chance25oftrue = (random.nextInt(4) == 0) ? true : false;


//For 40% chance of true
boolean chance40oftrue = (random.nextInt(5) < 2) ? true : false;

文本中的词汇总是随机性的来源。给定一个单词,就不能推断出下一个单词。对于每个单词,我们可以采取其字母的 ASCII 码,加上这些代码形成一个数字。这个数的奇偶性是一个很好的随机布尔值的候选者。

可能的缺点:

  1. 这个策略是基于使用文本文件作为单词的来源, 文件将到达结尾。但是,您可以估计需要调用 Random Boolean ()多少次 从你的应用程序的功能。如果你需要调用它大约100万次,那么一个文本文件与100万字就足够了。 作为更正,您可以使用来自在线报纸等实时来源的数据流

  2. 通过对一种语言中常见的短语和成语的统计分析,可以估计出一个短语中的下一个单词, 给出这个短语的第一个单词,有一定的准确性。但从统计学上来说,这种情况很少发生 所以,在大多数情况下,下一个单词是独立于前一个单词的。

    包装 p01;

    导入 java.io.File; 导入 java.nio.file. Files; 导入 java.nio.file. Path;

    公共类别主要{

    String words[];
    int currentIndex=0;
    
    
    public static String readFileAsString()throws Exception
    {
    String data = "";
    File file = new File("the_comedy_of_errors");
    //System.out.println(file.exists());
    data = new String(Files.readAllBytes(Paths.get(file.getName())));
    return data;
    }
    
    
    public void init() throws Exception
    {
    String data = readFileAsString();
    words = data.split("\\t| |,|\\.|'|\\r|\\n|:");
    }
    
    
    public String getNextWord() throws Exception
    {
    if(currentIndex>words.length-1)
    throw new Exception("out of words; reached end of file");
    
    
    String currentWord = words[currentIndex];
    currentIndex++;
    
    
    while(currentWord.isEmpty())
    {
    currentWord = words[currentIndex];
    currentIndex++;
    }
    
    
    return currentWord;
    }
    
    
    public boolean getNextRandom() throws Exception
    {
    String nextWord = getNextWord();
    int asciiSum = 0;
    
    
    for (int i = 0; i < nextWord.length(); i++){
    char c = nextWord.charAt(i);
    asciiSum = asciiSum + (int) c;
    }
    
    
    System.out.println(nextWord+"-"+asciiSum);
    
    
    return (asciiSum%2==1) ;
    }
    
    
    public static void main(String args[]) throws Exception
    {
    Main m = new Main();
    m.init();
    while(true)
    {
    System.out.println(m.getNextRandom());
    Thread.sleep(100);
    }
    }
    

    }

在 Eclipse 中,在我的项目的根目录中,有一个名为“ the _ comity _ of _ error”(没有扩展名)的文件——使用 File > New > File 创建,在这里我粘贴了一些内容: http://shakespeare.mit.edu/comedy_errors/comedy_errors.1.1.html

对于一个灵活的布尔随机发生器:

public static rbin(bias){
bias = bias || 50;
return(Math.random() * 100 <= bias);
/*The bias argument is optional but will allow you to put some weight
on the TRUE side. The higher the bias number, the more likely it is
true.*/
}

一定要使用数字 0-100,否则你可能会降低偏见,得到更多的共同 false值。

PS: 我对 Java 一无所知,除了它和 JavaScript 有一些共同之处。我使用我的 JavaScript 知识加上我的推理能力来构建这段代码。希望我的回答不会起作用。你们都可以编辑这个答案来解决任何我不知道的问题。