자바 보너스 뺏 기 보너스 생 성 알고리즘
보너스 생 성 알고리즘 수요
모든 보 너 스 를 미리 생 성 할 지,아니면 보 너 스 를 무 작위 로 생 성 할 지 요청 합 니 다.
쉽게 말 하면 하나의 큰 정수 m 를 분해(직접'단위,예 를 들 어 1 원 즉 100)하여 n 개의 작은 정수 로 분해 하 는 과정 이 고 작은 정수 의 범 위 는[min,max]이다.
가장 간단 한 사 고 는 먼저 바닥 을 확보 하고 모든 작은 보 너 스 는 min 을 확보 한 다음 에 모든 요 구 는 0 에서(max-min)범위 의 정 수 를 무 작위 로 생 성 한 다음 에 min 을 더 하면 보 너 스 의 돈 수 이다.
이 알고리즘 은 간단 하지만 단점 이 있 습 니 다.마지막 에 생 성 된 보 너 스 는 모두 min 돈 일 수 있 습 니 다.마지막 보너스 가 0.01 원 일 수도 있다 는 얘 기다.
다른 방법 은 모든 보 너 스 를 미리 생 성 하 는 것 이다.그러면 비교적 쉽게 통제 할 수 있다.내 가 선택 한 것 은 모든 보 너 스 를 미리 생 성 하 는 것 이다.
이상 적 인 보너스 생 성 알고리즘
이상 적 인 보너스 생 성 결 과 는 평균치 부근의 보너스 가 비교적 많 고 큰 보너스 와 작은 보너스 의 수량 이 비교적 적다.
보 너 스 를 만 드 는 수량의 분 포 는 약간 정상 적 인 분포 와 같다 는 것 을 상상 할 수 있다.
그렇다면 어떻게 이런 평균 선 부근 치가 비교적 많은 요 구 를 실현 합 니까?
평균 값 근처 의 확률 을 높 일 수 있 는 알고리즘 을 찾 는 것 이다.그러면'팽창'재'수축'방식 을 이용 하여 이런 효 과 를 얻는다.
먼저 제곱 하고 제곱 범위 내의 무 작위 수 를 생 성 한 다음 에 처방 하면 확률 은 더 이상 평균 적 인 것 이 아니다.
구체 적 인 알고리즘:
public class HongBaoAlgorithm {
static Random random = new Random();
static {
randomsetSeed(SystemcurrentTimeMillis());
}
public static void main(String[] args) {
long max = 200;
long min = 1;
long[] result = HongBaoAlgorithmgenerate(100_0000, 10_000, max, min);
long total = 0;
for (int i = 0; i < resultlength; i++) {
// Systemoutprintln("result[" + i + "]:" + result[i]);
// Systemoutprintln(result[i]);
total += result[i];
}
//
Systemoutprintln("total:" + total);
// ,
int count[] = new int[(int) max + 1];
for (int i = 0; i < resultlength; i++) {
count[(int) result[i]] += 1;
}
for (int i = 0; i < countlength; i++) {
Systemoutprintln("" + i + " " + count[i]);
}
}
/**
* min max , , min max 。
* , , , “ ” “ ” 。
*
* @param min
* @param max
* @return
*/
static long xRandom(long min, long max) {
return sqrt(nextLong(sqr(max - min)));
}
/**
*
* @param total
*
* @param count
*
* @param max
*
* @param min
*
* @return
*/
public static long[] generate(long total, int count, long max, long min) {
long[] result = new long[count];
long average = total / count;
long a = average - min;
long b = max - min;
//
// , 。
// 。 。
long range1 = sqr(average - min);
long range2 = sqr(max - average);
for (int i = 0; i < resultlength; i++) {
// , 。
// > ,
// < ,
if (nextLong(min, max) > average) {
//
// long temp = min + sqrt(nextLong(range1));
long temp = min + xRandom(min, average);
result[i] = temp;
total -= temp;
} else {
//
// long temp = max - sqrt(nextLong(range2));
long temp = max - xRandom(average, max);
result[i] = temp;
total -= temp;
}
}
// , , , 。
while (total > 0) {
for (int i = 0; i < resultlength; i++) {
if (total > 0 && result[i] < max) {
result[i]++;
total--;
}
}
}
// ,
while (total < 0) {
for (int i = 0; i < resultlength; i++) {
if (total < 0 && result[i] > min) {
result[i]--;
total++;
}
}
}
return result;
}
static long sqrt(long n) {
// ?
return (long) Mathsqrt(n);
}
static long sqr(long n) {
// , ?
return n * n;
}
static long nextLong(long n) {
return randomnextInt((int) n);
}
static long nextLong(long min, long max) {
return randomnextInt((int) (max - min + 1)) + min;
}
}
생 성 된 결 과 를 통계 해 보 니 요구 에 비교적 부합된다 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.