Ruby 랜덤 수 생성 방법 요약

2450 단어 Ruby무작위 수
숫자는 사실 랜덤이 아니에요.
순수하게 계산을 통해 진정한 무작위 수를 만들 수 있는 컴퓨터는 없다.그들이 할 수 있는 가장 좋은 일은 위조 랜덤수를 생성하는 것이다. 위조 랜덤수는 한 조가 보기에는 랜덤이지만 실제로는 랜덤이 아니다.
인류 관찰자에게 있어서 이 숫자들은 확실히 무작위적이다.짧은 반복 서열은 없을 뿐만 아니라, 적어도 인류 관찰자들에게는 완전히 무작위적이다.그러나 충분한 시간과 동기가 있으면 원시 피드를 발견하고 서열을 다시 만들고 서열의 다음 숫자를 추측할 수 있다.
따라서 본고에서 논의한 방법은 암호화해야 할 안전한 숫자를 만드는 데 사용되지 말아야 할 수도 있다.
위에서 말한 바와 같이, 새로운 랜덤 수를 생성할 때마다 다른 서열이 생기도록 위조 랜덤 생성기(PRNGs)를 파종해야 한다.신기한 방법은 하나도 없다. 랜덤으로 보이는 숫자들은 상대적으로 간단한 알고리즘과 상대적으로 간단한 산술로 생성된 것이다.PRNG를 파종하면 매번 다른 점에서 시작할 수 있다.만약 네가 파종을 하지 않는다면, 그것은 매번 같은 숫자 서열을 만들어 낼 것이다.
루비에서 인자 없이 코어 #srand 메서드를 호출할 수 있습니다.시간, 프로세스 ID 및 일련 번호에 따라 무작위 시드를 선택합니다.프로그램이 시작될 때 어디에서든 srand를 호출하면 실행될 때마다 랜덤으로 보이는 일련의 숫자가 생성됩니다.프로그램이 시작될 때 이 방법을 은밀하게 호출하고 시간과 프로세스 ID(시퀀스 번호 없음)를 사용하여 PRNG를 파종합니다.
숫자 생성
프로그램이 실행되고 코어 #srand가 은밀하거나 현저하게 호출되면 코어 #rand 방법을 호출할 수 있습니다.이 방법은 호출할 때 매개 변수가 없습니다. 0에서 1까지의 무작위 수를 되돌려줍니다.과거에 이 숫자는 일반적으로 당신이 생성하고자 하는 최대 숫자로 축소되었는데, 아마도 to_i 정수로 변환하기 위해 호출합니다.

# Generate an integer from 0 to 10
puts (rand() * 10).to_i
하지만 Ruby 1.9를 사용하는 경우x, 루비는 일을 더욱 간단하게 할 것이다.Kernel#rand 메서드는 개별 매개변수를 수용할 수 있습니다.만약 이 매개 변수가 어떤 종류의 숫자라면, 루비는 0에서 (포함하지 않음) 까지의 정수를 생성할 것이다.

# Generate a number from 0 to 10
# In a more readable way
puts rand(10)
하지만 10에서 15까지의 숫자를 생성하시겠습니까?일반적으로 0에서 5까지의 숫자를 생성하여 10에 추가합니다.그러나 루비는 그것을 더욱 쉽게 했다.
원하는 대로 Range 객체를 Kernel#rand에 전달할 수 있습니다. 이 범위 내에서 무작위 정수를 생성합니다.
이 두 가지 유형의 범위를 반드시 주의해야 한다.rand(10.15)를 호출하면 15를 포함한 10에서 15까지의 숫자가 생성됩니다.란드(10...15)(3개의 점이 있음)는 15를 포함하지 않고 10에서 15까지의 숫자를 생성한다.

# Generate a number from 10 to 15
# Including 15
puts rand(10..15)
비랜덤 랜덤 수
때로는 무작위로 보이는 숫자 서열이 필요하지만, 매번 같은 서열을 만들어야 합니다.예를 들어 단원 테스트에서 무작위 수를 생성하면 매번 같은 숫자 서열을 생성해야 한다.
한 시퀀스에서 실패한 단원 테스트는 다음 실행에서 다시 실패할 것입니다. 다음에 다른 시퀀스를 생성한다면 실패하지 않을 수도 있습니다.이를 위해, 이미 알고 있는 상수 값을 사용하여 코어 #srand를 호출합니다.

# Generate the same sequence of numbers every time
# the program is run
srand(5)
# Generate 10 random numbers
puts (0..10).map{rand(0..10)}
코어 #rand의 실현은 루비의 것이 아니라는 것을 주의하십시오.그것은 어떤 방식으로도 PRNG를 추상화하지 않고 PRNG를 실례화하는 것도 허락하지 않는다.PRNG의 경우 모든 코드가 하나의 글로벌 상태를 공유합니다.피드를 변경하거나 다른 방식으로 PRNG 상태를 변경하면 예상보다 더 광범위하게 영향을 미칠 수 있습니다.
그러나 프로그램이 이 방법의 결과가 무작위이기 때문에 (이것이 목적이기 때문에) 이것은 영원히 문제가 되지 않을 것이다.프로그램이 예상한 숫자 시퀀스를 보기를 원할 때, 예를 들어 상수 값을 가진 srand를 호출해야만 의외의 결과를 볼 수 있다.

좋은 웹페이지 즐겨찾기