1. 문제 정의 :
배열을 물어보십시오.이 배열의 값은 자신의 가중치가 어떻게 가중치를 선택할 수 있습니까? 교차로
예를 들어:
다음과 같이 코드 코드를 복사하십시오.
무게 : 8 2 11 79
무게로 반환 된 값 : 0 1 2 3
2. 문제 분석 :
아이디어 1 : 크기와 무게의 무게가 8이면 8 0 값을 넣고 값 1의 무게가 2 인 경우 2 값이 배치됩니다. 카테고리는 순서대로 푸시됩니다.
그런 다음 임의의 무게와 크기를 사용하여 임의의 숫자를 생성하십시오. 단점은 너무 많은 메모리를 차지해야합니다.
Idea 2:
무게와 배열 w [i] [0, i]의 모든 요소의 무게와 시간 복잡성을 저장합니다.
random [0, w [399]]] 랜덤 숫자가 어느 시간에 떨어지는 지 확인 O (longn)
그래서 총 시간 복잡성 복잡성 O (N) 공간 복잡성 O (N)
의사 코드 :
회전하는 도박은 특히 좋은 옵션은 아니지만 달성하기 쉽습니다.
우선, 교차 및 다른 연산자로 인해 진화 방향을 통제 할 수 없으므로 진화의 큰 책임은 선택 연산자에게 있습니다.
이것을 이해한다면 쉽게 할 수 있습니다.
회전하는 도박은 일반적으로 선택할 확률을 축적하는 것입니다.
if : Fit은 배열의 적응이며, 총 M 사본 코드 코드는 다음과 같습니다.
i = 1 ~ m '
Sum = sum+fit (i)
다음 i
i = 1 ~ n 'n의 경우, 얼마나 많은 개인을 생성하고 싶습니까?
Temp = temp + fit (i)
rnd <= temp / s 인 경우
출력 i가 결과입니다
종료 기능
끝 If
다음 i
셋째, 문제 해결 :
다음과 같이 코드 코드를 복사하십시오.
패키지 데이터 인프라;
java.util.hashmap import;
java.util.map import;
/**
중량 랜덤 숫자 :
체중이 있다면 : 8 2 11 79
무게로 반환 된 값 : 0 1 2 3
@author ajian005 [email protected]
2014-2-16 21:12
출력 결과 : {2.0 = 184128, 11.0 = 348551, 79.0 = 1308100, 8.0 = 159221}}
*/
공개 클래스 계량 체중 테스트 {
개인 정적 DoubleArray = {8.0, 2.0, 11.0,79.0};
public static void main (String [] args) {{
계량 체중 계량 = 새로운 계량 트랜덤 ();
Map <Double, Integer> stat = new Hashmap <double, integer> ();
for (int i = 0; i <2000000; i ++) {
int heidgevalue = meadtrandom.getweightrandom (WeightArrays);
if (weightValue <0) {{
계속하다;
}
System.out.println ( "무작위 숫자 중량으로 반환됩니다 :" + wheembalue);
if (stat.get (WeightArrays [heideidValue]) == null) {
STAT.PUT (WeightArrays [heideidValue], 1);
} 또 다른 {
STAT.PUT (WeightArrays [heideightValue], stat.get (WeightArrays [heideidValue])+1);
}
}
System.out.println (STAT);
}
}
계급 계량 {
java.util.random r = new java.util.random ();
Private Double HeademerArraysum (Double [] WeightArrays) {{
이중 웨이트섬 = 0;
for (double weightValue : heidearrays) {
WeightSum += heideightValue;
}
리턴 웨이트섬;
}
public int getweightrandom (double [] headeRrays) {{
Double WeightSum = HeaderArraysum (WeightArrays);
더블 스테이트 웨이트 = 0;
for (int i = 0; i <heidearrays.length; i ++) {
stepweightsum += HeaderArray [i];
if (math.random () <= stepweightsum/weightsum) {
//system.out.println (i);
반환 i;
}
}
System.out.println ( "오류");
반품 -1;
}
}
넷째, 요약 요약 :
러시아 라운드 도박은 달성 가능성을 축적하는 것입니다
종속로드 스케줄링 등