자바 보너스 뺏 기 보너스 생 성 알고리즘

5077 단어 자바상여금
곧 설 이다.설 을 쇠 는 위 챗 보너스 가 인 기 를 끌 고 있 습 니 다.최근 에 보너스 뺏 기 를 하 는 프로젝트 가 있어 서 보너스 생 성 알고리즘 을 썼 습 니 다.
보너스 생 성 알고리즘 수요
모든 보 너 스 를 미리 생 성 할 지,아니면 보 너 스 를 무 작위 로 생 성 할 지 요청 합 니 다.
쉽게 말 하면 하나의 큰 정수 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; 
  } 
} 
생 성 된 결 과 를 통계 해 보 니 요구 에 비교적 부합된다
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기