2012-06-05 1 views
5
Write an efficient algorithm to print the following two outputs 

Sie sind gegeben eine vordefinierte Funktion mit dem Namen getrand100(), die zurückgibt eine ganze Zahl einzigartige Zufallszahlen erzeugen, die von 1-100 eine Zufallszahl ist. Sie können diese Funktion so oft wie Sie möchten anrufen, aber passen Sie auf, dass diese Funktion recht ressourcenintensiv ist. Sie können keinen anderen Zufallsgenerator verwenden. Sie können die Definition von getrand100() NICHT ändern.Wie aus einem gegebenen Zufallsgenerator

int getrand100(){ 
    Random rand = new Random(); 
return (1+rand.nextInt(100));  
} 
  • Output1: Druck Zahlen 1-20 in zufälliger Reihenfolge. (Nicht 20 Zufallszahlen)
  • Ausgabe2: Drucken Sie die Zahlen 1-200 in zufälliger Reihenfolge. (Nicht 200 Zufallszahlen)

Hinweis:

  • i. Jede Nummer sollte genau einmal gedruckt werden.
  • ii. Es sollte kein Muster in der Nummernliste sein. Liste sollte völlig zufällig sein
    , d.h. alle Zahlen haben gleiche Wahrscheinlichkeit, die an irgendeinem Ort erscheint.
  • iii. Sie können betrand100() beliebig oft aufrufen, um die Zufallszahl von 1 bis 100 zu erhalten.
  • iv. Sie können keinen anderen Zufallsgenerator Funktion außer getrand100() verwenden.
+0

Ist das Hausaufgaben? – dckrooney

+0

Die einfachste Lösung, mit der Sie beginnen können, ist die "Brute-Force" -Lösung :). Fügen Sie einer Liste eine Nummer hinzu, solange sie noch nicht da ist - aber das ist nicht "effizient". – Xeon

Antwort

3

Die Idee ist, den Zufallsgenerator zu verwenden, um die erforderlichen Zufallszahlen zu berechnen.

1) Für Zufallszahlen 1-20, teilen nur die 100-Nummern gleich 1 bis 20.

2) darstellen 1-200 zu erzeugen, die geraden Zahlen von 1 bis 200 und fügen Sie dann finden (- 1 oder 0), um alle Zahlen von 1 bis 200 zu erhalten.

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(); 
    } 

} 
+2

Das ist nicht die Art von Information, die dem OP helfen würde, die ** Hausaufgaben ** alleine zu lösen. – JimmyB

+0

was meinst du und was ist dein problem? Wenn Sie zu meiner Lösung keinen konstruktiven Vorschlag haben, müssen Sie sich nicht äußern. – Subs

+0

@Subs Homeworks sollte nicht im Detail beantwortet werden, gut +1 für die Eingabe –

2

Angenommen, dies ist Hausaufgabe, werde ich die Antwort knapp halten. :)

Blick in die modulus Operator%

+0

Ja, das ist eine Heimarbeit, aber ich kann keine Logik dafür implementieren. Bitte hilf mir, Jungs, es ist dringend. Vielen Dank. –

+0

Wie bereits erwähnt, kann die Brute-Force-Lösung am einfachsten zu implementieren sein, wenn Sie für die Zeit geknirscht sind. – dckrooney

+0

@dcrooney - normalerweise stimme ich dir zu, aber der Lehrer macht klar, dass "getrand100() ziemlich ressourcenintensiv ist", was darauf hindeutet, dass alle Anrufe über das absolute Minimum eine Bestrafungsstrafe nach sich ziehen. –

0

Sie eine Liste mit Ihrem Wert schaffen könnten (1 - 20, 1 - 200) und eine Zufallszahl, sortieren Sie die Liste auf der Zufallszahl.

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()); 
} 

Das ist nicht so gut für die 200-Liste sein könnte, nur weil Sie Zufallszahl bis zu 100 wollen könnte erzeugen können getrand100() * getrand100() oder etwas verwenden, um ein breiteres Spektrum von Zufallszahlen zu erzeugen .