2015-05-01 3 views
0

Я хочу сделать один метод в рубин, который возвращает одно случайное число из массива и сделал это:Ruby - удалить номер из случайного массива и вернуть массив с n случайными числами?

@nr = 1..60 

def ar_one 
    ar = @nr.to_a.shuffle 
    ar.pop 
end 

Но я получить число больше, чем один раз, а массив никогда не равен нулю. Что не так с этим?

И мне нужен метод, который дает мне n * random_numbers_from_array. Итак, если я говорю n = 3, чем хочу: [12, 1, 59] что-то вроде этого и удаляю эти 3 числа там индекс. Я пробовал это, но я получил только одно случайное число в индексе n-1.

def ar_all(n=3) 
    arr = [] 
    @nr.each do |nr| 
     arr.insert(n-1,ar_one) 
     n += -1 
    return arr 
end 
end 

Было бы здорово, если кто-то может сказать, какая ошибка я сделал в arr_one и как получить все п случайных чисел в arr_all, спасибо.

+0

Ваше название и первое предложение противоречивы. Первый должен быть исправлен. Очевидно, вы хотите вернуть удаленное число, а не результирующий массив. –

ответ

3

Проблема заключается в том, что вы на самом деле создать новый массив, каждый раз при запуске методы ar_one.

ar = @nr.to_a.shuffle # <= here you create a new array and shuffle it 
ar.pop    # <= here you pop and return the first element of that new array 

Ваш второй пример не удается, потому что вы возвращаетесь из этого метода в конце первой итерации each блока, сразу после сбора только один элемент:

@nr.each do |nr| 
    arr.insert(n-1,ar_one) 
    n += -1 
    return arr   #<= here you return from that method without checking `n` 
end 

Я хотел бы сделать что-то вроде этого:

class Sampler 
    def initialize(number = 60) 
    @array = (1..number).to_a.shuffle 
    end 

    def one 
    @array.pop 
    end 

    def many(number) 
    @array.pop(number) 
    end 
end 

sampler = Sampler.new(4) 
sampler.one 
#=> 2 
sampler.many(3) 
#=> [3, 1, 4] 
+0

Спасибо за вашу помощь, он работает сейчас. – Faculty

0

Вы можете сделать это в простом и легком пути:

@array = [1,2,3,4,5,6,7,8,9] 

def random_collector 
    number = @array.sample 
    index = @array.index(number) 
    @array.delete_at(index) 
    number  
end 
+0

Спасибо, что это помогает мне получить мои 6 случайных чисел в моем втором коде, но массив = array- [номер] не удалить номера из массива в моем коде: Num = 1..7 Защиту ar_one а = num.to_a пг = a.sample Num = num.to_a- [NR] NR конец защиту ar_all (N = 6) \t а = num.to_a \t NR = a.sample (n) \t num = num.to_a- [nr] \t nr конец – Faculty

+0

см. Редактирование. я уже обновил –

+0

О, спасибо, теперь он отлично работает. – Faculty

0

Я предлагаю:

def random_collector 
    @array.delete_at(rand(@array.size)) 
end 

Если @array не подлежит изменению, обратитесь к документации.