2017-11-08 2 views
1

무작위로 n을 생성하려면 그 합이 m이어야하며이 x는 x와 y 사이에 있어야합니다.x와 y 사이의 합계가 m 인 무작위 번호를 생성

예를 들어

: - 나는 20 아니, 3 사이에 9 필요하다고하면 그 합을 포함 내가 제한뿐만 아니라 더의 합과 필요한 양을 지정하려면 (100)

해야하는 사이 무작위 번호가 생성되어야하며 그것은 지정된 금액의 무작위 번호를 제공해야합니다. 아래는 2보다 큰 no를 생성하는 코드이지만 최대 제한을 넣을 수는 없습니다. 또한, 나오는 합계와 아니오의 합계. 그것이 생성하는 것은 지정된 합계와 같지 않습니다. 나는 완전히 혼란스러워 나를 도와주세요.

TextView textView,randomTotaltxt; 
int count0 = 0; 
int count1 = 0; 
int targetSum = 100; 
int numberofDraws = 20; 

    textView = (TextView) findViewById(R.id.textview); 
    randomTotaltxt = (TextView) findViewById(R.id.randomTptalText); 

    Random r = new Random(); 
    ArrayList<Integer> load = new ArrayList<>(); 

    //random no 
    int sum = 0; 
    for (int i=0; i<numberofDraws;i++){ 
     int next = r.nextInt(targetSum)+1; 
     Log.d("No",""+next); 
     load.add(next); 
     sum += next; 
    } 

    //scale it 
    double scale = 1d*targetSum/sum; 
    sum=0; 
    for (int i=0; i<numberofDraws;i++){ 
     load.set(i, (int)(load.get(i)*scale)); 
     sum += load.get(i); 
    } 

    while (load.contains(0)|| load.contains(1)){ 
     for (int i=0; i<load.size();i++) { 
      if (load.get(i).equals(0)) { 
       load.set(i, load.get(i) + 2); 
       count0++; 
       sum = sum+1; 
      } 
      if (load.get(i).equals(1)) { 
       load.set(i, load.get(i) + 2); 
       sum += load.get(i); 
       count1++; 
       sum = sum+1; 
      } 
     } 
    } 

    // take rounding 
    while (sum++ <targetSum){ 
     int i = r.nextInt(numberofDraws); 
     load.set(i, load.get(i) + 1); 
    } 

    textView.setText(""+load); 
    randomTotaltxt.setText(""+(sum-1)); 

답변

0

이것은 최적의 해결책은 아니지만 필요에 따라 작업을 수행합니다.

int targetSum = 100; 
int numberOfDraws = 20; 
int uppr=0; 
int countt =0; 
ArrayList<Integer> load = new ArrayList<>(); 
Random random; 
TextView textView1,randomTotaltxt1; 

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    textView1 = (TextView) findViewById(R.id.textview1); 
    randomTotaltxt1 = (TextView) findViewById(R.id.randomTptalText1); 

    random = new Random(); 

    //random no 
    int sum = 0; 
    for (int i=0; i<numberOfDraws;i++){ 
     int next = random.nextInt(targetSum)+1; 
     load.add(next); 
     sum += next; 
    } 

    //scale it 
    double scale = 1d*targetSum/sum; 
    sum=0; 
    for (int i=0; i<numberOfDraws;i++){ 
     load.set(i, (int)(load.get(i)*scale)); 
     sum += load.get(i); 
    } 

    // take rounding 
    while (sum++ <targetSum){ 
     int i = random.nextInt(numberOfDraws); 
     load.set(i, load.get(i) + 1); 
     Log.d("TAG",""+load); 
    } 

    checkForUpperRange(); 
} 

public void checkForUpperRange(){ 
    for (int i=0; i<numberOfDraws;i++){ 
     int n = load.get(i); 

     if (n > 9){ 
      load.set(i, 9); 
      uppr = n - 9; // getting the required no. 
      adjustUpper(); 
      break; 
     } 

     checkForLowerRange(); 
    } 
} 

private void adjustUpper() { 
    for (int j=0; j<numberOfDraws;j++){ 
     if (load.get(j) > 2){ 
      load.set(j, load.get(j)+uppr); // uppr is added 
      checkForUpperRange(); 
      break; 
     } 
    } 
} 

public void checkForLowerRange(){ 
    for (int i=0; i<numberOfDraws;i++){ 
     int n = load.get(i); 

     if (n == 0){ 
      load.set(i, load.get(i)+3); // 3 is added in sum 
      adjust0(); 
      break; 
     } 

     if (n == 1){ 
      load.set(i, load.get(i)+2); // 2 is added in sum 
      adjust1(); 
      break; 
     } 

     if (n == 2){ 
      load.set(i, load.get(i)+1); // 1 is added in sum 
      adjust2(); 
      break; 
     } 

     getCount(); 
    } 
} 

public void getCount(){ 
    countt = 0; 
    for (int k=0; k<numberOfDraws;k++){ 
     countt = countt+ load.get(k); 
     showResult(); 
    } 
} 

public void showResult(){ 
    textView1.setText(""+load); 
    randomTotaltxt1.setText(""+countt); 
} 

public void adjust0(){ 
    for (int j=0; j<numberOfDraws;j++){ 
     if (load.get(j) > 3){ 
      load.set(j, load.get(j)-3); // 3 is subtracted 
      checkForLowerRange(); 
      break; 
     } 
    } 
} 

public void adjust1(){ 
    for (int j=0; j<numberOfDraws;j++){ 
     if (load.get(j) > 3){ 
      load.set(j, load.get(j)-2); // 2 is subtracted 
      checkForLowerRange(); 
      break; 
     } 
    } 
} 

public void adjust2(){ 
    for (int j=0; j<numberOfDraws;j++){ 
     if (load.get(j) > 3){ 
      load.set(j, load.get(j)-1); // 1 is subtracted 
      checkForLowerRange(); 
      break; 
     } 
    } 
}