在Java中获取随机布尔值

时间:2012-07-13 09:57:59

标签: java random boolean

好的,我在代码中实现了这个问题: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 ...

10 个答案:

答案 0 :(得分:89)

我建议使用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)你正在使用一些非标准的破坏实现。

答案 1 :(得分:28)

您也可以尝试nextBoolean() - 方法

以下是一个示例:http://www.tutorialspoint.com/java/util/random_nextboolean.htm

答案 2 :(得分:22)

你有没有试过看太阳的(oracle)文档?

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#nextBoolean()

无论如何这里的示例代码:

    java.util.Random

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

答案 3 :(得分:5)

Java 8 :使用与当前线程隔离的随机生成器:ThreadLocalRandom nextBoolean()

  

与Math类使用的全局Random生成器类似,ThreadLocalRandom使用内部生成的种子进行初始化,否则可能无法修改。适用时,在并发程序中使用ThreadLocalRandom而不是共享的Random对象通常会遇到更少的开销和争用。

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

答案 4 :(得分:2)

为什么不使用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);
    }
  }
}

答案 5 :(得分:0)

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

Random generator = new Random();

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

通过为Random构造函数提供'seed'参数,您可以使其看起来更“随机”,您可以通过例如系统时间(以毫秒为单位)动态构建该参数

答案 6 :(得分: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

答案 7 :(得分:0)

您可以将以下内容用于无偏见的结果:

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;

答案 8 :(得分:0)

文本中的单词始终是随机性的来源。给定一个单词,就不能推断出下一个单词。对于每个单词,我们可以采用其字母的ASCII码,然后将这些代码相加以形成数字。此数字的奇偶校验是随机布尔值的很好的选择。

可能的缺点:

  1. 此策略基于将文本文件用作单词的来源。在某一点, 文件的末尾将到达。但是,您可以估计需要调用多少次randomBoolean() 从您的应用程序运行。如果您需要调用它大约一百万次,那么一个带有一百万个单词的文本文件就足够了。 作为更正,您可以使用来自在线报纸等在线资源的数据流。

  2. 使用某种语言中的常用短语和习语进行统计分析,可以估算出短语中的下一个单词, 给出词组的第一个单词,并具有一定的准确性。但从统计学上讲,这些情况很少见,只要我们能够准确地 预测下一个单词。因此,在大多数情况下,下一个单词独立于前一个单词。

    包p01;

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

    公共类主要{

    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_comedy_of_errors'(无扩展名)的文件-使用File> New> File创建,我在此处粘贴了以下内容:http://shakespeare.mit.edu/comedy_errors/comedy_errors.1.1.html

答案 9 :(得分:-1)

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

Random rand = new Random();

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

int range = 2;

生成2个随机整数。

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

然后只需比较返回值。

return a == b; 

我也有一个你可以使用的课程。 RandomRange.java