2016-08-23 3 views
0

몇 가지 변수에 임의의 값을 생성해야합니다. 그런 다음 그 값이 특정 특성을 충족 시키면 그 값을 지우고 다시 생성해야합니다 (변수의 값을 다시 정의 하시겠습니까?).Ruby에서 난수 생성, 평가 및 재 생성

아마도 함수를 사용하여이 작업을 수행해야하지만 함수에서 만든 변수의 "지역"을 이스케이프하는 방법을 모르겠습니다. 스크립트에서 나중에 호출해야합니다.

x = rand(1...9) 
y = rand(1...9) 
z = rand(1...9) 

는 그 후 나는/난 그냥 경험이없는

"간단한"솔루션이 있어야합니다 같이 보인다
if x - y - z < 0 
then **start over** until x - y - z > 0 
end 

같은 뭔가가 필요 :

그래서 내가 가진 가정 해 봅시다 볼 지식. 어떤 아이디어를 높이 평가!

+0

유용한 답변을 찾은 경우 가장 좋아하는 답변을 선택하십시오. –

답변

0

이 시도 :이 같은

x = rand(1...9) 
    y = rand(1...9) 
    z = rand(1...9) 

while x - y - z > 0 
    x = rand(1...9) 
    y = rand(1...9) 
    z = rand(1...9) 
end 

puts "x: #{x}, y: #{y}, z: #{z}" 

더 일반적인 방법을 사용하고있을 수 있습니다 방법 :

def generate 
    x = rand(1...9) 
    y = rand(1...9) 
    z = rand(1...9) 
    [x,y,z] 
end 
x,y,z = generate() 

while x - y - z > 0 
    x,y,z = generate() 
end 

puts "x: #{x}, y: #{y}, z: #{z}" 
4

당신이 시간을 볼거야,이 프로그램의 패턴의 숫자, 그리고 특히 루비 그리고 다시 시간. 이 생성 및 검증 실패시 다시 실행 형식 패턴은 매우 일반적이며 Ruby는 일반적으로 begin ... end while (cond) 구조를 가지고 있습니다.

여기에서 당신에게 불리한 점은 세 가지 변수가 있다는 것입니다. 이는 조직 코드를 유지하는 데 필수적인 Zero, One or Infinity Rule을 위반합니다. "하나"이상의 것을 처리 할 때는 배열과 같은 데이터 구조를 사용하는 것을 고려하십시오.

def random_values(count = 3) 
    begin 
    values = Array.new(count) { rand(1...9) } 
    end while (values.inject(&:-) <= 0) 

    values 
end 

이것은 당신이 당신의 기준을 충족 하나를 찾을 때까지 목록을 생성 유지 : 계정에 모든 촬영

여기에 간단한 방법입니다. inject 호출은 목록을 반복하고 다음 요소에서 하나의 요소를 뺀 다음 후속 루프에서 해당 결과를 사용하여 특정 집합의 숫자에 대해 빼기를 수행하는 빠른 방법입니다.

Array 생성자에는 두 개의 인수가 주어 지는데 하나는 미리 할당 할 요소 수이고 두 번째는 해당 요소를 생성하는 방법을 정의하는 블록입니다. 이것은 임의 길이의 N 길이 배열을 만드는 빠른 방법입니다. 이것은 당신이 당신의 기준과 일치하는 첫 번째 항목을 문제로 Enumerable 라이브러리를 적용하고 find 할 수 있습니다

random_values = Enumerator.new do |y| 
    loop do 
    y << Array.new(3) { rand(1...9) } 
    end 
end 

:

지금이 일을 약간 더 루비 방법은 임의의 숫자의 발전기 세트 정의하는 것입니다.이 같은 일을이 방법의 장점은 함께 할 수 있습니다 체인 것들을
first = random_values.find do |x, y, z| 
    x - y - z > 0 
end 

입니다

얻을 : 여기 당신은 코드를 간단하게 유지하기 위해이 지역 테스트 블록 내에서 배열의 변수를 확장 할 수 있습니다

selection = random_values.lazy.select do |x, y, z| 
    x - y - z > 0 
end.first(10) 

이것은 "게으른"배열을 열거합니다. 즉 완료 될 때까지 해당 루프를 실행하는 경우 필요에 따라 생성하고 selection이라는 배열에 저장 한 첫 번째 10 개를 꺼냅니다.

+0

while values.inject (& :-) <= 0'을 사용하지 않는 이유는 무엇입니까? – pjs

+0

대단히 감사합니다. 그래서 스크립트의 뒷부분에서이 함수 밖에서 배열 값을 호출 할 수 있습니까? 즉 값 [0]을 넣거나 값 [0] + 값 [1]을 넣는가? –

+0

@pjs 실제로 그게 더 좋은 방법입니다. 나는 그것을 바꿀 것입니다. 감사! – tadman