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

Si è data una funzione denominata getrand100 predefinito(), che restituisce un intero che è un numero a caso 1-100. È possibile chiamare questa funzione tutte le volte che si desidera, ma attenzione che questa funzione è a basso consumo di risorse. Non puoi usare nessun altro generatore casuale. NON è possibile modificare la definizione di getrand100().Come creare numeri casuali uniche da un dato generatore casuale

int getrand100(){ 
    Random rand = new Random(); 
return (1+rand.nextInt(100));  
} 
  • Output1: i numeri di stampa 1-20 in ordine casuale. (Non 20 numeri casuali)
  • Output2: stampa i numeri 1-200 in ordine casuale. (non 200 numeri casuali)

Nota:

  • i. Ogni numero dovrebbe essere stampato esattamente una volta.
  • ii. Non ci dovrebbero essere schemi nella lista dei numeri. L'elenco dovrebbe essere completamente casuale
    , ad esempio, tutti i numeri hanno uguale probabilità che appaiono in qualsiasi luogo.
  • iii. È possibile chiamare getrand100() qualsiasi numero di volte per ottenere il numero casuale da 1 a 100.
  • iv. Non è possibile utilizzare qualsiasi altra funzione di generatore casuale eccetto getrand100().
+0

È questo compito? – dckrooney

+0

Probabilmente la soluzione più semplice con cui iniziare è la soluzione 'brute-force' :). Aggiungi a un elenco un numero mentre non è ancora lì, ma non è "efficiente". – Xeon

risposta

3

L'idea è di usare il generatore casuale dato per calcolare i numeri casuali richiesti.

1) Per i numeri casuali 1-20, basta dividere i 100 numeri ugualmente rappresentare 1 a 20.

2) Per generare 1-200, per i numeri pari da 1 a 200 e poi aggiungere (- 1 o 0) per ottenere tutti i numeri da 1 a 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(); 
    } 

} 
+2

Questo non è il tipo di informazione che potrebbe aiutare l'OP a risolvere i ** compiti ** da solo. – JimmyB

+0

cosa intendi e qual è il tuo problema? Se non hai suggerimenti costruttivi per la mia soluzione, allora non devi commentare. – Subs

+0

@Subs A Homeworks non si deve rispondere in dettaglio, bene +1 per l'input –

2

Supponendo che questo sia compito, terrò la risposta tersa. :)

Guardare in modulus operatore%

+0

Sì, questo è un lavoro a domicilio, ma non sono in grado di implementare una logica per questo. Per favore aiutami ragazzi è urgente. Grazie. –

+0

Come già accennato, la soluzione per la forza bruta potrebbe essere la più semplice da implementare se si è costretti a perdere tempo. – dckrooney

+0

@dcrooney - normalmente sarei d'accordo con te, tuttavia l'istruttore chiarisce che getrand100() è "abbastanza intensivo in termini di risorse", il che suggerisce che qualsiasi chiamata oltre il minimo necessario incorre in una penalizzazione. –

0

Si potrebbe creare una lista con il proprio valore (1 - 20, 1 - 200) e un numero casuale, quindi ordinare l'elenco del numero casuale.

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

Questo potrebbe non essere così buono per la lista 200, dal momento che si può solo generare numeri casuali fino a 100. potrebbe desiderare di utilizzare getrand100() * getrand100() o qualcosa di generare una più ampia gamma di numeri casuali .

Problemi correlati