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

Вы приведены предопределенные функции с именем getrand100(), которая возвращает целое число, которое одно случайное число в диапазоне 1-100. Вы можете вызвать эту функцию столько раз, сколько хотите, но будьте осторожны, чтобы эта функция была довольно ресурсоемкой. Вы не можете использовать какой-либо другой случайный генератор. Вы не можете изменить определение getrand100().Как создать уникальные случайных чисел из заданного случайного генератора

int getrand100(){ 
    Random rand = new Random(); 
return (1+rand.nextInt(100));  
} 
  • Output1: Печать номера 1-20 в случайном порядке. (Не 20 случайных чисел)
  • Выход 2: печатать номера 1-200 в случайном порядке. (не 200 случайных чисел)

Примечание:

  • я. Каждый номер должен печататься ровно один раз.
  • ii. В листинге номеров не должно быть шаблонов. Список должен быть полностью случайным
    т. Е. Все числа имеют равную вероятность появления в любом месте.
  • iii. Вы можете называть getrand100() любое количество времени, чтобы получить случайное число от 1 до 100.
  • iv. Вы не можете использовать какой-либо другой случайный генератор , кроме getrand100().
+0

Это домашнее задание? – dckrooney

+0

Возможно, самым простым решением, с которого вы можете начать, является решение «грубой силы» :). Добавьте к списку число, пока его еще нет, но это не «эффективно». – Xeon

ответ

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

} 
+2

Это не та информация, которая помогла бы OP самостоятельно решить ** домашнюю работу **. – JimmyB

+0

Что вы имеете в виду и в чем проблема? Если у вас нет конструктивного предложения для моего решения, вам не нужно комментировать. – Subs

+0

@Subs Домашние задания не должны быть в ответе подробно, хорошо +1 для ввода –

2

Предполагая, что это домашнее задание, я оставлю ответ кратким. :)

Посмотрите в modulus оператора%

+0

Да, это домашняя работа, но я не в состоянии реализовать некоторую логику для этого. Пожалуйста, помогите мне, ребята, срочные. Благодарю. –

+0

Как уже упоминалось, решение грубой силы может быть проще всего реализовать, если вы хрустели на время. – dckrooney

+0

@ dcrooney - обычно я согласен с вами, однако инструктор ясно дает понять, что getrand100() «достаточно ресурсоемкий», предполагая, что любые вызовы по минимальному минимуму будут нести штраф за оценку. –

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

Это может быть не так хорошо для 200 списка, так как вы можете только генерировать случайные числа до 100. Может хотите использовать getrand100() * getrand100() или что-то, чтобы создать более широкий диапазон случайных чисел ,

Смежные вопросы