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

Se le da una función getrand100 nombre predefinido() que devuelve un número entero que es un número aleatorio 1-100. Puede llamar a esta función tantas veces como lo desee, pero tenga en cuenta que esta función es que consume muchos recursos. No puedes usar ningún otro generador aleatorio. NO puede cambiar la definición de getrand100().Cómo crear números aleatorios únicos de un generador aleatorio dado

int getrand100(){ 
    Random rand = new Random(); 
return (1+rand.nextInt(100));  
} 
  • Output1: los números de impresión 1-20 en orden aleatorio. (No 20 números aleatorios)
  • Salida2: Imprima números 1-200 en orden aleatorio. (No 200 números aleatorios)

Nota:

  • i. Cada número debe imprimirse exactamente una vez.
  • ii. No debería haber ningún patrón en la lista de números. La lista debe ser completamente aleatoria
    es decir, todos los números tienen la misma probabilidad de aparecer en cualquier lugar.
  • iii. Puede llamar a getrand100() cualquier cantidad de tiempo para obtener el número aleatorio de 1 a 100.
  • iv. No puede usar ninguna otra función de generador aleatorio excepto getrand100().
+0

¿Es esta tarea? – dckrooney

+0

Probablemente la solución más simple que puede comenzar es la solución 'fuerza bruta' :). Agregue un número a la lista mientras todavía no está allí, pero esto no es "eficiente". – Xeon

Respuesta

3

La idea es utilizar el generador aleatorio dado para calcular los números aleatorios necesarios.

1) Para números aleatorios 1-20, simplemente dividir los 100 números por igual para representar 1 a 20.

2) Para generar 1-200, encontrar los números pares de 1 a 200 y luego añadir (- 1 o 0) para obtener todos los números del 1 al 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

Ese no es el tipo de información que ayudaría al OP a resolver ** la tarea ** solo. – JimmyB

+0

¿Qué quieres decir y cuál es tu problema? Si no tiene una sugerencia constructiva para mi solución, entonces no tiene que hacer ningún comentario. – Subs

+0

@Subs Homeworks no debe responderse en detalle, bien +1 para la entrada –

2

Suponiendo que esto es tarea, voy a mantener la respuesta breve. :)

mirada hacia el operador% modulus

+0

Sí, este es un trabajo a domicilio, pero no puedo implementar algo de lógica para esto. Por favor, ayúdenme chicos es urgente. Gracias. –

+0

Como ya se mencionó, la solución de fuerza bruta puede ser la más fácil de implementar si tiene problemas de tiempo. – dckrooney

+0

@dcrooney: normalmente estoy de acuerdo con usted, sin embargo, el instructor deja en claro que getrand100() es "bastante intensivo en recursos", lo que sugiere que cualquier llamada que exceda el mínimo exigirá una penalización de clasificación. –

0

se podría crear una lista con su valor (1 - 20 de 1 - 200) y un número al azar, a continuación, ordenar la lista en el número al azar.

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

Esto podría no ser tan bueno para la lista 200, ya que sólo se puede generar números aleatorios hasta 100. Puede que desee utilizar getrand100() * getrand100() o algo para generar una gama más amplia de números aleatorios .

Cuestiones relacionadas