80

好的,我在我的代码中实现了这个 SO 问题: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每次都会得到结果......

4

11 回答 11

118

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

于 2012-07-13T10:04:51.237 回答
40

您是否尝试过查看Java 文档

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

例如:

import java.util.Random;

Random random = new Random();
random.nextBoolean();
于 2012-07-13T10:04:14.460 回答
34

您也可以尝试nextBoolean()-Method

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

于 2012-07-13T10:02:51.697 回答
10

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

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

java.util.concurrent.ThreadLocalRandom.current().nextBoolean();
于 2017-12-19T00:47:57.117 回答
3

为什么不使用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);
    }
  }
}
于 2012-07-13T10:09:08.983 回答
1

您可以使用以下内容来获得公正的结果:

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;
于 2019-04-07T16:37:47.780 回答
0

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

Random generator = new Random();

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

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

于 2012-07-13T10:05:21.097 回答
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

于 2012-07-13T10:14:27.680 回答
0

对于灵活的布尔随机化器:

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 知识和我的推理能力来构建这段代码。期望我的回答不起作用。你们都可以编辑这个答案来解决我不知道的任何问题。
于 2021-10-13T00:21:26.310 回答
0

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

可能的缺点:

  1. 该策略基于使用文本文件作为词源。在某些时候,将到达文件的末尾。但是,您可以估计从您的应用程序调用 randomBoolean() 函数的次数。如果你需要调用它大约 100 万次,那么一个包含 100 万字的文本文件就足够了。作为更正,您可以使用来自在线报纸等实时来源的数据流。

  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

于 2019-05-02T12:49:59.350 回答
0

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

Random rand = new Random();

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

int range = 2;

生成 2 个随机整数。

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

然后简单地比较返回值。

return a == b; 

我也有你可以使用的类。 随机范围.java

于 2017-07-20T19:19:15.837 回答