2012-02-26 5 views
1

100 ~ 999 사이의 고유 난수 시퀀스를 생성하고 싶습니다. 각 숫자가 고유하도록 두 번 생성되지 않도록하고 싶습니다. 여기에 내가 생각해 낸 것이있다. 작동하지 않습니다. 내가 그것을 실행할 때, 화면은 그냥 비어 있습니다. 누구든지 나를 도울 수 있습니까? 당신의 방법의 마지막 문 products이 비어있는 경우 실행되지 않습니다 while 루프이라고Ruby에서 반복되지 않는 난수 생성

products = {} 

def random_key(products) 

    rand_key = rand(900) + 100 

    while products.has_key?(rand_key) 

    rand_key = rand(900) + 100 

    end 

end 

puts random_key(products) 
+0

반복되지 않는 숫자에 대한 요구 사항에 유의하십시오. 즉, 셔플 알고리즘이 필요합니다. – casperOne

답변

0

알 수 있습니다. 따라서 함수는 nil을 반환합니다.

는 다음과 같이하십시오 :이 999에 100 번 무한 루프에 모든 숫자를 얻기의 잠재력을 가지고,

products = {} 

def random_key(products) 

    rand_key = rand(900) + 100 

    while products.has_key?(rand_key) 

    rand_key = rand(900) + 100 

    end 

    rand_key 

end 

puts random_key(products) 

참고 그러나 products

+0

도움을 주셔서 감사합니다. 나는 거의 그것을 가지고 있었다. –

+0

당신이 원한다면 upvote하시기 바랍니다,하지만 Marc Talbot의 대답은 http://stackoverflow.com/a/9458016/402253이 받아 들일만한 가치가 있다고 생각합니다. – Mchl

0

에있는 함수는 동안 식을 반환 항상 nil입니다. 대신 수를 반환해야합니다 : 당신이 배치하여 중복을 제거 할 수 있습니다

def random_key(products) 
    rand_key = rand(900) + 100 
    while products.has_key?(rand_key) 
    rand_key = rand(900) + 100 
    end 
    rand_key 
end 

주 "동안"키 생성 후 :

def random_key(products) 
    begin 
    rand_key = rand(900) + 100 
    end while products.has_key?(rand_key) 
    rand_key 
end 

그리고 당신은 하나의 표현

def random_key(products) 
    rand_key = rand(900) + 100 while products.has_key?(rand_key) 
    rand_key 
end 
에 대한 begin end를 생략 할 수 있습니다
11
a = (100..999).to_a.shuffle 

언제든지 새로운 ID가 필요할 때마다

new_id = a.pop 

이렇게하면 숫자를 절대 다시 사용할 수 없습니다. 물론 배열의 요소가 부족할 때 문제가 발생합니다.