JAVA : 随机生成具有概率的整数
JAVA : generate integer numbers randomly with probabilities
如果数字范围从(1
到 50
), 如果数字范围从 (50
到 100
)?
, 概率为 70%
int integer = new Random().nextInt(100) + 1;
// Probabilities
..... code here ....
我该怎么做?
这里有一个方法getRandom()
,它returns一个满足您指定标准的随机数。它实际上使用 0
和 9
之间的随机数来确定使用两个范围中的哪一个。
public int getRandom() {
Random random = new Random();
int val = random.nextInt(10);
if (val < 3) {
return random.nextInt(50) + 1; // random range 1 to 50
}
else {
return random.nextInt(51) + 50; // random range 50 to 100
}
}
这是一个通用解决方案,它将 return 任意数量的事件之一,您可以在其中指定事件的相对权重。权重可以是概率,但不是必须的;它们不必加起来为 1。例如,如果您有三个事件,并且您希望第一个事件的概率为 20%,第二个概率为 30%,第三个概率为 50%,您可以调用 addEvent
在每个事件上使用 2、3 和 5 作为第二个参数,或 20、30 和 50,或 0.2、0.3 和 0.5,或具有这些比率的任何其他数字组合。对于您的情况,您可以将通用参数设为一个间隔并添加两个权重为 3 和 7(或 30 和 70,或其他)的事件;然后,当您调用 randomEvent
并且它 return 是一个具有端点 m
和 n
包含 的区间时,您会生成另一个该区间内的随机数:
value = m + random.nextInt(n - m + 1);
其中 random
是您自己的 Random
实例。
class RandomDistribution<T> {
private class Event {
public final T event;
public final double relativeWeight;
public Event(T event, double relativeWeight) {
this.event = event;
this.relativeWeight = relativeWeight;
}
}
private double totalWeight = 0D;
private ArrayList<Event> events = new ArrayList<>();
private Random generator = new Random();
public void addEvent(T event, double relativeWeight) {
events.add(new Event(event, relativeWeight));
totalWeight += relativeWeight;
}
public T randomEvent() {
double random = generator.nextDouble() * totalWeight;
for (Event event : events) {
random -= event.relativeWeight;
if (random < 0D) {
return event.event;
}
}
// It's possible to get here due to rounding errors
return events.get(events.size() - 1).event;
}
}
您可以使用MockNeat probabilities()方法。
String s = mockNeat.probabilites(String.class)
.add(0.1, "A")
.add(0.2, "B")
.add(0.5, "C")
.add(0.2, "D")
.val();
以上示例将生成 "A" 的概率为 10%,B 的概率为 20%,依此类推。
Integer x = m.probabilites(Integer.class)
.add(0.2, m.ints().range(0, 100))
.add(0.5, m.ints().range(100, 200))
.add(0.3, m.ints().range(200, 300))
.val();
以上示例将生成 [0, 100) 范围内的数字,概率为 20%,[100, 200) 范围内的数字,概率为 50%,以及 [200, 300) 范围内的数字有 30% 的概率。
免责声明:我是图书馆的作者,所以我在推荐它时可能会有偏见。
如果数字范围从(1
到 50
), 如果数字范围从 (50
到 100
)?
70%
int integer = new Random().nextInt(100) + 1;
// Probabilities
..... code here ....
我该怎么做?
这里有一个方法getRandom()
,它returns一个满足您指定标准的随机数。它实际上使用 0
和 9
之间的随机数来确定使用两个范围中的哪一个。
public int getRandom() {
Random random = new Random();
int val = random.nextInt(10);
if (val < 3) {
return random.nextInt(50) + 1; // random range 1 to 50
}
else {
return random.nextInt(51) + 50; // random range 50 to 100
}
}
这是一个通用解决方案,它将 return 任意数量的事件之一,您可以在其中指定事件的相对权重。权重可以是概率,但不是必须的;它们不必加起来为 1。例如,如果您有三个事件,并且您希望第一个事件的概率为 20%,第二个概率为 30%,第三个概率为 50%,您可以调用 addEvent
在每个事件上使用 2、3 和 5 作为第二个参数,或 20、30 和 50,或 0.2、0.3 和 0.5,或具有这些比率的任何其他数字组合。对于您的情况,您可以将通用参数设为一个间隔并添加两个权重为 3 和 7(或 30 和 70,或其他)的事件;然后,当您调用 randomEvent
并且它 return 是一个具有端点 m
和 n
包含 的区间时,您会生成另一个该区间内的随机数:
value = m + random.nextInt(n - m + 1);
其中 random
是您自己的 Random
实例。
class RandomDistribution<T> {
private class Event {
public final T event;
public final double relativeWeight;
public Event(T event, double relativeWeight) {
this.event = event;
this.relativeWeight = relativeWeight;
}
}
private double totalWeight = 0D;
private ArrayList<Event> events = new ArrayList<>();
private Random generator = new Random();
public void addEvent(T event, double relativeWeight) {
events.add(new Event(event, relativeWeight));
totalWeight += relativeWeight;
}
public T randomEvent() {
double random = generator.nextDouble() * totalWeight;
for (Event event : events) {
random -= event.relativeWeight;
if (random < 0D) {
return event.event;
}
}
// It's possible to get here due to rounding errors
return events.get(events.size() - 1).event;
}
}
您可以使用MockNeat probabilities()方法。
String s = mockNeat.probabilites(String.class)
.add(0.1, "A")
.add(0.2, "B")
.add(0.5, "C")
.add(0.2, "D")
.val();
以上示例将生成 "A" 的概率为 10%,B 的概率为 20%,依此类推。
Integer x = m.probabilites(Integer.class)
.add(0.2, m.ints().range(0, 100))
.add(0.5, m.ints().range(100, 200))
.add(0.3, m.ints().range(200, 300))
.val();
以上示例将生成 [0, 100) 范围内的数字,概率为 20%,[100, 200) 范围内的数字,概率为 50%,以及 [200, 300) 范围内的数字有 30% 的概率。
免责声明:我是图书馆的作者,所以我在推荐它时可能会有偏见。