범위 중간에 숫자를 생성 할 가능성이 더 높은 숫자를 생성하는 방법을 찾으려고 노력하고 있습니다. 주어진:
rnum = r.nextInt(5) + 1;//+ 1 to exclude 0
1과 5 사이의 완전한 난수를 생성합니다 ( + 1
제거 된 경우 0과 4 ). 내가 원하는 것은 1과 5를 적게 생성하고 3을 많이 생성하는 것입니다. 나는 이것을 시도했다 :
int[] classes = {1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 5, 5};
System.out.println("Class " + classes[r.nextInt(15)]);//logs the output
그러나 다음을 생성합니다. (print 문이 10 번 반복됨)
Class 2
Class 3
Class 1
Class 4
Class 3
Class 4
Class 2
Class 3
Class 2
Class 5
그러나 이것은 효율적이거나 좋은 방법이 아닙니다. 또한 숫자를 검색하는 데 사용되는 난수 생성기는 중앙 값에 초점을 맞추지 않고 완전히 임의적이기 때문에 위의 출력을 만듭니다. 3은 30 % 만 나타나며 이는 너무 낮습니다. 2도 30 %의 시간에 나타납니다. 즉,이 테스트에서는 3과 동일한 확률이 생성됩니다.
그렇다면 범위 중간에 숫자를 생성 할 확률이 더 높은 무작위로 숫자를 생성하려면 어떻게해야합니까?
가장 쉬운 방법은 원하는 확률을 포함하는 배열로 시작하는 것입니다.
import java.util.Random;
class Main {
public static int getOneNumber(double[] probs, Random rnd) {
double r = rnd.nextDouble();
for (int j = 0; j < probs.length; j++) {
if (r < probs[j]) {
return j;
}
r -= probs[j];
}
throw new RuntimeException("probabilities should sum to 1");
}
public static void main(String[] args) {
// Desired probabilities
double[] probabilities = {
0.05, // 0
0.15, // 1
0.6, // 2
0.15, // 3
0.05 }; // 4
Random rnd = new Random();
for (int i = 0; i < 20; i++) {
System.out.println(getOneNumber(probabilities, rnd));
}
}
}
여기의 아이디어는 다음과 같습니다. 0과 1 사이의 난수를 생성합니다. 이제 확인합니다. 0.05 미만입니까? 그렇다면 0을 반환하고 0.05 확률로 발생합니다. 그렇지 않은 경우 숫자가 0.05에서 0.15 사이인지 확인합니다 (0.05를 빼고 0.1과 비교하여). 만약 그렇다면 (이것은 확률 0.15-0.05 = 0.1로 발생합니다)-우리는 1을 얻었습니다. 그렇지 않다면 난수가 0.15와 0.75 사이인지 등을 확인합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다