我正在尝试制作一个黑盒方法来测试我的项目是否正常工作,但我遇到了随机数生成的一些问题。
我有这样的方法:
public static MathObject generateBlackBoxObject() {
double functionChance = 0.5;
double maxValue = 10;
double minValue = -10;
if (rng.nextDouble() < functionChance)
{
double random = rng.nextDouble();
if (random < 1/3)
{
return Add.apply(Utility.generateBlackBoxObject(), Utility.generateBlackBoxObject());
}
else if (random < 2/3)
{
return Multiply.apply(Utility.generateBlackBoxObject(), Utility.generateBlackBoxObject());
}
else
{
return Exponentiate.apply(Utility.generateBlackBoxObject(), Utility.generateBlackBoxObject());
}
}
else
{
double random = rng.nextDouble();
if (random < 1/2)
{
return Constant.create(rng.nextDouble() * (maxValue - minValue) + minValue);
}
else
{
return Variable.create(rng.nextDouble() * (maxValue - minValue) + minValue);
}
}
}
它使用单个java.util.Random
,但我遇到的问题是它最有可能选择Variable.create ...
路径,然后选择Exponentiation.apply ...
路径。它不太可能适用于Multiply
和永远(!)来电Add.apply
或Constant.create
看起来rng喜欢更频繁地选择更高的值,或者以前的随机双倍影响下一个更高的值。
任何人都可以从中了解发生了什么,并且(很可能)我在这里做错了什么?