我需要创建一个Java方法来随机返回true
或false
。怎么做呢?
java.util.Random
类已经具有此功能:
public boolean getRandomBoolean() {
Random random = new Random();
return random.nextBoolean();
}
然而,每次需要一个随机布尔值时总是创建一个新的Random
实例不够高效。相反,在需要随机布尔值的类中创建一个类型为Random
的属性,然后使用该实例来获取每个新的随机布尔值:
public class YourClass {
/* Oher stuff here */
private Random random;
public YourClass() {
// ...
random = new Random();
}
public boolean getRandomBoolean() {
return random.nextBoolean();
}
/* More stuff here */
}
(Math.random() < 0.5)
随机返回 true 或 false
public boolean randomBoolean(){
return Math.random() < 0.5;
}
public class RandomBoolean {
Random random = new Random();
public boolean getBoolean() {
return random.nextBoolean();
}
public static void main(String[] args) {
RandomBoolean randomBoolean = new RandomBoolean();
for (int i = 0; i < 10; i++) {
System.out.println(randomBoolean.getBoolean());
}
}
}
通过这种方式,您可以获得它:
return Math.random() < 0.5;
ThreadLocalRandom.current().nextBoolean()
Random
对象,请使用{{link1:ThreadLocalRandom
}}。每个线程只有一个这样的对象。boolean rando = ThreadLocalRandom.current().nextBoolean() ;
Java的Random
类利用了CPU的内部时钟(据我所知)。同样,我们可以使用RAM信息作为随机源。只需打开Windows任务管理器,选择性能选项卡,查看物理内存 - 可用:它会不断变化;大多数情况下,该值每秒更新一次,仅在极少数情况下该值会保持几秒钟的恒定。 其他更经常变化的值是系统句柄和线程,但我没有找到获取它们值的cmd
命令。因此,在这个例子中,我将使用可用物理内存作为随机源。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public String getAvailablePhysicalMemoryAsString() throws IOException
{
Process p = Runtime.getRuntime().exec("cmd /C systeminfo | find \"Available Physical Memory\"");
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()));
return in.readLine();
}
public int getAvailablePhysicalMemoryValue() throws IOException
{
String text = getAvailablePhysicalMemoryAsString();
int begin = text.indexOf(":")+1;
int end = text.lastIndexOf("MB");
String value = text.substring(begin, end).trim();
int intValue = Integer.parseInt(value);
System.out.println("available physical memory in MB = "+intValue);
return intValue;
}
public boolean getRandomBoolean() throws IOException
{
int randomInt = getAvailablePhysicalMemoryValue();
return (randomInt%2==1);
}
public static void main(String args[]) throws IOException
{
Main m = new Main();
while(true)
{
System.out.println(m.getRandomBoolean());
}
}
}
正如您所看到的,核心部分是运行cmd命令systeminfo
,使用Runtime.getRuntime().exec()
。
为了简洁起见,我省略了try-catch语句。我已经运行了这个程序多次,没有出现错误 - cmd命令的输出中总是有一个“可用物理内存”行。
可能的缺点:
main()
函数中,while(true)
循环内部没有Thread.sleep()
,但仍然只在控制台上打印输出大约每秒钟一次。您可以使用以下内容获得无偏差的结果:
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%!
如果您希望将结果更多地倾向于true或false,则可以按如下方式进行调整!
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;
//表示40%的几率为真 boolean chance40oftrue = (random.nextInt(100) < 40);
- Patrice M.
randomBoolean
可以直接是new Random()
,而不是getBoolean()
,可以使用nextBoolean()
。上面的代码只是添加了一个无意义的类包装。 - whitfin