好吧,我实现了这个SO质疑我的代码: 返回true或false随机
但是,我有奇怪的行为:我需要同时运行十个实例,其中每个实例每次运行返回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
的结果每次都...
Answer 1:
我建议使用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)你有一些不规范的破实施工作。
Answer 2:
您也可以尝试nextBoolean()
-方法
下面是一个例子: http://www.tutorialspoint.com/java/util/random_nextboolean.htm
Answer 3:
你想看看太阳(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();
Answer 4:
Java的8:使用隔离到当前线程随机生成: ThreadLocalRandom nextBoolean()
像由Math类使用的全局随机发生器,ThreadLocalRandom被初始化为内部生成的种子否则可能不被修改。 如果适用,使用ThreadLocalRandom的,而不是在并行程序共享随机对象通常遇到更少的开销和争用。
java.util.concurrent.ThreadLocalRandom.current().nextBoolean();
Answer 5:
为什么不使用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);
}
}
}
Answer 6:
初始化一个随机数发生器的最简单方法是使用参数的构造函数,例如
Random generator = new Random();
然而,在使用此构造方法,你应该认识到,算法随机数生成器是不是真正随机的,他们真的产生数字的固定的,而是随机找序列算法。
你可以把它显得更“随机”通过给随机构造的“种子”参数,您可以通过使用系统时间以毫秒为单位(这将永远是不同的),动态构建,例如
Answer 7:
你可以让你的时钟()值并检查它是否是奇数还是偶数。 我不知道这是否是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
Answer 8:
您可以使用一个不带偏见的结果如下:
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;
Answer 9:
在文本中的字总是随机源。 给予一定的一句话,没有什么可以推断出关于下一个单词。 对于每一个字,我们可以把它的字母的ASCII码,添加这些代码,从而形成许多。 这个号码的奇偶性是随机的布尔一个很好的候选人。
可能的缺点:
这种策略是基于使用文本文件作为词的来源。 在某些时候,该文件的末尾将达到。 但是,您可以估算你估计有多少次从您的应用程序调用randomBoolean()函数。 如果您需要调用它约100万次,然后用1万个字的文本文件就足够了。 作为校正,则可以使用数据流从像在线报纸将实时源。
使用语言的常用短语和成语的一些统计分析,可以估算下一个单词的词组,因为这句话的第一个字,具有一定程度的准确性。 但在统计学上,这些情况是罕见的,当我们可以accuratelly预测下一个单词。 因此,在大多数情况下,下一个字是独立于先前的话。
包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”(没有扩展名)的文件-使用文件>新建>文件,在这里我粘贴一些内容,从这里创造: http://shakespeare.mit.edu/comedy_errors /comedy_errors.1.1.html
Answer 10:
您也可以让两个随机整数和验证他们是否是相同的,这让您的概率更多的控制。
Random rand = new Random();
声明一个范围来管理随机概率。 在这个例子中,有一种被真正的几率为50%。
int range = 2;
2个生成随机整数。
int a = rand.nextInt(range);
int b = rand.nextInt(range);
然后简单地比较返回值。
return a == b;
我也有,你可以使用一个类。 RandomRange.java
文章来源: Get random boolean in Java