如何在 Java 中保持多次执行的概率
How can I maintain probability across multiple executions in Java
首先我不是最擅长数学的,所以请原谅任何与此相关的无知。我试图在多次执行中保持基于概率的随机性,但我失败了。我在 JSONObject
中有这个输入
{
"option1": 25,
"option2":25,
"option3" :10,
"option4" :40
}
这是我的函数,它根据分配的概率从上面的 JSONObject 中选择一个值:
public static String selectRandomoptions(JSONObject options) {
String selectedOption = null;
if (options != null) {
int maxChance = 0;
for (String option : options.keySet()) {
maxChance += options.getInt(option);
}
if (maxChance < 100) {
maxChance = 100;
}
Random r = new Random();
Integer randomValue = r.nextInt(maxChance);
int chance = 0;
for (String option : options.keySet()) {
chance += options.getInt(option);
if (chance >= randomValue) {
selectedOption = options.toLowerCase();
break;
}
}
}
}
如果我在单次执行中调用它 x 次(测试 100 多次调用),该函数的行为在合理的误差范围内,问题是我 运行 每小时生成一些样本事件驱动应用程序中的数据来验证我们的分析 process/data 但我们需要它在某种程度上是可预测的,至少在合理的范围内?
有人知道我该如何处理吗?我宁愿不必坚持任何事情,但如果有意义或减少 complexity/time.
我不反对
Random.nextInt()
返回的值是均匀分布的,所以这应该不是问题。
如果您想使随机结果可重复,那么您可能需要使用 Random
with seed。
与其每次需要一个新的随机数时都创建一个新的 Random() 对象,不如每次 运行 创建一次 Random 对象,然后每个 [=25] 使用一次 Random.nextInt()
对象=].
查看 Random()
构造函数的文档,
This constructor sets the seed of the random number generator to a
value very likely to be distinct from any other invocation of this
constructor.it only guarantees it to be different
这比你从 nextInt()
得到的数字要弱一些。
如果要在每个 运行 上获得相同的数字序列,请使用随机对象的 Random(long seed)
或 setSeed(long seed)
方法。这两种方法都设置了生成器的种子。如果您为每次调用使用相同的种子,则可以保证您将从生成器中获得相同的数字序列。
Random.setSeed(long).
首先我不是最擅长数学的,所以请原谅任何与此相关的无知。我试图在多次执行中保持基于概率的随机性,但我失败了。我在 JSONObject
中有这个输入{
"option1": 25,
"option2":25,
"option3" :10,
"option4" :40
}
这是我的函数,它根据分配的概率从上面的 JSONObject 中选择一个值:
public static String selectRandomoptions(JSONObject options) {
String selectedOption = null;
if (options != null) {
int maxChance = 0;
for (String option : options.keySet()) {
maxChance += options.getInt(option);
}
if (maxChance < 100) {
maxChance = 100;
}
Random r = new Random();
Integer randomValue = r.nextInt(maxChance);
int chance = 0;
for (String option : options.keySet()) {
chance += options.getInt(option);
if (chance >= randomValue) {
selectedOption = options.toLowerCase();
break;
}
}
}
}
如果我在单次执行中调用它 x 次(测试 100 多次调用),该函数的行为在合理的误差范围内,问题是我 运行 每小时生成一些样本事件驱动应用程序中的数据来验证我们的分析 process/data 但我们需要它在某种程度上是可预测的,至少在合理的范围内?
有人知道我该如何处理吗?我宁愿不必坚持任何事情,但如果有意义或减少 complexity/time.
我不反对Random.nextInt()
返回的值是均匀分布的,所以这应该不是问题。
如果您想使随机结果可重复,那么您可能需要使用 Random
with seed。
与其每次需要一个新的随机数时都创建一个新的 Random() 对象,不如每次 运行 创建一次 Random 对象,然后每个 [=25] 使用一次 Random.nextInt()
对象=].
查看 Random()
构造函数的文档,
This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.it only guarantees it to be different
这比你从 nextInt()
得到的数字要弱一些。
如果要在每个 运行 上获得相同的数字序列,请使用随机对象的 Random(long seed)
或 setSeed(long seed)
方法。这两种方法都设置了生成器的种子。如果您为每次调用使用相同的种子,则可以保证您将从生成器中获得相同的数字序列。
Random.setSeed(long).