5
Write an efficient algorithm to print the following two outputs

getrand100()という名前の事前定義された関数が与えられます。この関数は、1から100までの1つの乱数である整数を返します。この関数は何度でも呼び出すことができますが、この関数は非常に多くのリソースを消費することに注意してください。他のランダムジェネレーターは使用できません。getrand100()の定義を変更することはできません。

int getrand100(){
    Random rand = new Random();
return (1+rand.nextInt(100));      
}
  • 出力1:番号1〜20をランダムな順序で出力します。(20個の乱数ではありません)
  • 出力2:番号1〜200をランダムな順序で出力します。(200個の乱数ではありません)

ノート:

  • 私。すべての番号は1回だけ印刷する必要があります。
  • ii。番号リストにパターンがあってはなりません。リストは完全にランダムである必要があります
    。つまり、すべての数字はどの場所にも同じ確率で表示されます。
  • iii。getrand100()を何度でも呼び出して、1から100までのランダムな数値を取得できます。
  • iv。getrand100()以外のランダムジェネレーター関数は使用できません。
4

3 に答える 3

3

アイデアは、必要な乱数を計算するために与えられた乱数発生器を使用することです。

1) 乱数 1 ~ 20 の場合、100 個の数字を等分して 1 ~ 20 を表します。

2) 1-200 を生成するには、1 から 200 までの偶数を見つけ、それに (-1 または 0) を追加して、1 から 200 までのすべての数を取得します。

import java.util.*;
public class Rand20_200{
   int number20[]=new int[20]; //numbers in random order
   int number200[]=new int[200];

   public Rand20_200(){
    int n=0;
    int ngen[]=new int[20]; //to store which random numbers are generated
    while(n<20){
      int rnd=1 + (getrand100()-1) / 5;
      if (ngen[rnd-1]==0){
        ngen[rnd-1]=1;
        number20[n++]=rnd;
      }
    }
    System.out.println("Random 20 numbers");
    print(number20);

    ngen=new int[200]; //to store which random numbers are generated
    int numoff[]={-1,0}; //offset to add
    n=0;
    while(n<200){
      int rnd=numoff[(getrand100()-1)/50]+ (getrand100()*2);
      if (ngen[rnd-1]==0){
     ngen[rnd-1]=1;
     number200[n++]=rnd;
      }
    }   
    System.out.println("\nRandom 200 numbers");
    print(number200);
   }

   int getrand100(){
    Random rand = new Random();
    return (1+rand.nextInt(100));      
   }

   void print(int arr[]){
     for(int i=0;i<arr.length;i++){
       System.out.print(arr[i]+" ");
     }
   }

   public static void main(String args[]){
     new Rand20_200();
   }

 }
于 2012-06-05T03:23:34.257 に答える
2

これは宿題だと仮定して、答えは簡潔にします。:)

モジュラス演算子 %を調べる

于 2012-06-05T01:36:40.350 に答える
0

値 (1 ~ 20、1 ~ 200) と乱数を使用してリストを作成し、乱数でリストを並べ替えることができます。

public class RandomListItem
{
    int value;
    int sortindex;

    public RandomListItem(x,y)
    {
        value = x;
        sortindex = y;
    }
}

for(int i = 1; i <= maxvalue; i++)
{
    list.add(new RandomListItem(i, getrand100());
}

乱数は 100 までしか生成できないため、これは 200 のリストにはあまり適していない可能性があります。

于 2012-06-05T02:05:13.997 に答える