可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I need to generate some random booleans. However I need to be able to specify the probability of returning true
. As a results doing:
private Random random = new Random();
random.nextBoolean();
will not work.
One possible solution would be:
private Random random = new Random()
public boolean getRandomBoolean(float p){
return random.nextFloat() < p;
}
I was wondering if there is a better or more natural way of doing this.
EDIT:
I guess I am asking whether there is a library class that provides a nextBoolean(float probability) method.
回答1:
I was wondering if there is a better or more natural way of doing this.
The approach you're using already is fine.* AFAIK, there's not a standard Java method that will make this code any shorter.
* For non-cryptographic purposes.
回答2:
1) Yes, i think your approach is valid and I don't see another easier way.
2) There is a library for handling random numbers of different statistical distributions:
http://introcs.cs.princeton.edu/java/22library/StdRandom.java.html
回答3:
The MockNeat library implements this feature.
Example for generating a boolean value that has 99.99% of being true:
MockNeat m = MockNeat.threadLocal();
boolean almostAlwaysTrue = m.bools().probability(99.99).val();
回答4:
public boolean getBiasedRandom(int bias) {
int c;
Random t = new Random();
// random integers in [0, 100]
c=t.nextInt(100);
if (c>bias){return false;
}
else{return true;}
}
This one is based on percentage...
回答5:
Here's what I'm using. Very similar to FracturedRetina's answer.
Random random = new Random();
// 20% chance
boolean true20 = (random.nextInt(5) == 0) ? true : false;
// 25% chance
boolean true25 = (random.nextInt(4) == 0) ? true : false;
// 40% chance
boolean true40 = (random.nextInt(5) < 2) ? true : false;
回答6:
Expanding on user2495765's answer,
you can make a function which takes an input ratio (as two values chance:range see code)
public class MyRandomFuncs {
public Random rand = new Random();
boolean getBooleanAsRatio(int chance, int range) {
int c = rand.nextInt(range + 1);
return c > chance;
}
}
Depending on what you intend to do, you probably don't want to initalize Random from within your method but rather use as a class variable (as in the code above) and call nextInt() from within your function.
回答7:
Your way is probably better, code golf-wise, but another way to do it is like this:
public boolean getRandomBoolean() {
Random random = new Random();
//For 1 in 5
int chanceOfTrue = 5;
if (random.nextInt(chanceOfTrue) == 0) {
return true;
} else {
return false;
}
}
Or for 2 in 5, try this:
public boolean getRandomBoolean() {
Random random = new Random();
//For 2 in 5
int chanceOfTrue = 5;
int randInt = random.nextInt(chanceOfTrue);
if (randInt == 0 || randInt == 1) {
return true;
} else {
return false;
}
}
回答8:
Random object needs to be intialized already.
public static boolean flipRandom(double probability) {
Validate.isBetween(probability, 0, 1, true);
if(probability == 0)
return false;
if(probability == 1)
return true;
if(probability == 0.5)
return random.nextBoolean();
return random.nextDouble() < probability ? true : false;
}