Редактировать: Этот ответ основан на неправильном прочтении вопроса, где я взял "много раз, кроме 0 и -1", чтобы обозначить "много больше раз, чем 0 и -1" . Я оставляю этот ответ на тот случай, если он пригодится кому-то еще, но я сомневаюсь, что он будет полезен для оригинального постера.
Чтобы сгенерировать неоднородные случайные числа, вам необходимо указать, какие веса должны быть. Например, возможно, вы хотите, чтобы в 1 было в три раза больше единиц, чем в 0 или -1.
Вот метод, который принимает массив из трех double
значений, где первое значение является весом для -1, второе значение является весом для 0, а третье значение является весом для 1. Это будет сгенерируйте -1, 0 или 1 с различной вероятностью на основе заданных вами весов.
public int minusOneZeroOrOne(final double[] weights)
{
if (weights.length != 3)
throw new IllegalArgumentException("Must provide three weights");
double weightTotal = 0.0;
for (final double next : weights)
weightTotal += next;
double random = Math.random() * weightTotal;
if (random < weights[0])
return -1;
if (random < (weights[0] + weights[1]))
return 0;
return 1;
}
Я проверил этот метод, вызвав его с массивом веса { 1.0, 1.0, 3.0 }
(то есть в три раза больше 1, чем 0 или -1), сто тысяч раз, и я получил следующие результаты:
$ java RandomTest | sort | uniq -c
20062 -1
19776 0
60162 1
Как видите, я получил примерно в три раза больше результатов "1", чем результатов "0" или "-1".