도전 과제에서 무작위 생성을 지정하는 방법


16

참고 : Meta합의에 따라 질문이 여기에 있습니다.

이 "도전을 작성할 때 피해야 할 것"에 비추어 , 나는 특정 종류의 물체의 무작위 생성과 관련된 문제에 대해 생각하기 시작했습니다.

때로는 foo를 무작위로 생성하는 챌린지 를 게시하려는 경우가 있습니다 .

  1. 주어진 것이 foo인지 확인하는 것은 매우 쉽습니다.
  2. "좋은 품질의"임의의 foo를 빠르게 생성하는 것은 조금 더 어렵습니다.

예로서, foo는 임의의 방향으로 4 개의 동일한 비트의 세그먼트가없는 이진 행렬 일 수있다. 주어진 이진 행렬이 foo인지 확인하는 것은 쉽지만, 잘 퍼진 분포로 임의의 foo를 생성하려면 역 추적 알고리즘 또는 이와 유사한 것이 필요합니다.

어쨌든 이제 무작위 foo로 자격이되는 것을 객관적으로 지정해야하며, 프로그램을 여러 번 실행할 때 결과가 항상 다르게 보이는 직관적 인 의미에서 "예측할 수없는"것이 필요합니다. 가장 제한적인 접근 방식은 출력이 균일하게 랜덤하도록 요구하는 것입니다. 모든 유효한 foo는 생성 확률이 동일합니다. 모든 유효한 foo를 생성하고 중복을 제거하고 지루하고 느린 것을 선택하기 위해 저장하는 방법을 알지 못하기 때문에 일반적으로 너무 제한적입니다.

다음 아이디어는 모든 유효한 foo가 생성 될 가능성이 높다는 것입니다. 그러나 이것은 다음과 같은 접근 방식이 유효하다는 것을 의미합니다. 임의의 foo와 같은 것을 생성합니다 (이 예제에서는 임의의 이진 행렬). ). 이것은 기본적으로 랜덤 매트릭스 생성기에 고정 된 foos의 인식기이므로 다소 지루합니다.

예측할 수없는 임의의 foo에 대한 좋은 일반 정의가있을 수 있습니까?

TL; DR

분포를 수정하지 않지만 하드 코딩을 방해하는 "예측할 수없는"무작위로 생성 된 개체를 지정하는 좋은 방법이 있습니까?


우리는 하드 코딩을 금지하지만 무작위 로 메타에 대한 표준 정의를 가지고 있지만 완벽하게 균일하게 제한하지는 않습니다.
Geobits

5
좋은 질문입니다. 나는 과거 에 무작위성을 지정하는 것이 어렵다는 것을 발견했다 . 특히 설명하는 시나리오의 경우 무작위 후보를 생성하고 유효하지 않은 경우 다시 실행할 수있는 문제도 있습니다. 심지어 균일 한 배포를 제공하지만 결정적이지 않은 런타임을 제공합니다. 균일 분포를 지정할 때 실제 솔루션이 완벽하게 균일 하지 않다는 문제도 있습니다 . 이것은 매우 미묘한 문제입니다. +1
Martin Ender

@MartinEnder 맞아, 나는 그 접근법을 잊었다. 시간 제한이있는 다른 느린 알고리즘은 허용하지 않지만 여전히 "하나의 하드 코딩 된 foo"솔루션을 허용합니다.
Zgarb

K3 / K4 CPRNG를 지정할 수있는 것처럼 보입니다. 대부분의 언어에는 라이브러리 en.wikipedia.org/wiki/Pseudorandom_number_generator
Ewan

1
@Zgarb "Generate and redo"를 허용하지 않는 큰 문제는 대부분의 언어 RNG 라이브러리가 그렇게한다는 것입니다.
Nathan Merrill

답변:


5

천 다른 foos를 반환

이로 인해 하드 코딩 된 값을 반환 할 수없고 괜찮은 골프가 있습니다. 그러나 합법적 foo 생성기는 실제로 중복 foo를 확인하지 않는 한 중복 foo를 출력 할 가능성이 적습니다. 검사 부담을 제거하기 위해 경험적으로 테스트 된 실패율 (예 : 10 %)을 허용 가능한 것으로 지정할 수 있습니다.

알고 생일 역설 중복 확률은 당신이 생각하는 것보다 더 높을 수 있음. 백만 개의 가능한 foo가있는 경우 천 개의 임의 foo는 어딘가에 중복이있을 확률이 약 0.6이며 foo 생성이 완전히 균일하다고 가정합니다. 이것이 문제가 될 수 있다면, 생성 된 1000 개마다 900 개의 고유 한 foo를 요구해야합니다. 이는 foo 생성기에는 훨씬 관대하지만 여전히 하드 코딩에는 비실용적입니다.

이를 통해 foo와 같은 것을 반복해서 생성하고 foo를 얻을 때까지 fooness를 확인할 수 있습니다. 나는 이것이 유효한 해결책이라고 생각하지만, 당신이 그것을 좋아하지 않는다면 :

빨리 해

완전히 임의의 foo와 같은 것이 foo 일 가능성은 매우 낮을 수 있으므로 시간 제한을 지정하면 foo 생성시 진정한 시도가 발생할 수 있습니다.

다른 언어 간의 속도 차이를 수용하려면 Hackerrank와 같은 언어에 따라 다른 시간 제한을 원할 수 있습니다 ( https://www.hackerrank.com/environment) . 그러나 충분히 큰 foo를 지정하면 임의의 foo와 같은 것이 foo 일 확률이 실제로 낮을 수 있으므로 "우주의 열사병 전"규칙으로 충분할 수 있습니다.


나는 당신이 여기 뭔가 있다고 생각합니다. "프로그램을 N 번 실행하면 최소한 90 %의 복제본이 생성되지 않습니다"는 구체적이고 테스트하기가 쉽고, 무차별 강제 및 간단한 거부 샘플링을 방지하기 위해 시간 제한과 결합 될 수 있습니다.
Zgarb

2

나는 문제에 대한 궁극적 인 해결책을 가지고 있다고 주장하지는 않지만 (또는이 목록이 철저하다고 주장하지만) 생각할 수있는 접근법과 왜 작동하지 않을지에 대해 간략히 설명하고 싶습니다. 또한 현재 타임 스탬프를 임의의 소스로 사용하는 것이 충분히 예측할 수 없는지 여부와 확률 분포의 특정 속성을 적용하는 방법과 같은 접선 문제를 다루지 않습니다.

해결책이 아님 : 명시 적으로 하드 코딩 금지

이것은 나쁜 생각입니다. 그것은 관찰 할 수없는 요구 사항입니다 (즉, 프로그램을 실행하여 만족하는지 여부를 결정할 수 없음을 의미합니다) .PPCG에서 권장하지 않습니다. 않으며 다른 플랫폼에서 프로그램을 실행하면 제출이 확인되는 경우 불가능할 수 있습니다 자동화 된 방식. 이와 같은 요구 사항의 문제점은 "하드 코딩"에 대한 객관적인 정의를 찾아 시작해야한다는 것입니다. 일반적으로이 방법을 사용하면 상황이 악화 될뿐입니다.

하드 코딩을 불가능하게 만들기

완전히 허용 할 수는 없지만 사람들이 그것을 사용하지 않기를 원한다면, 하드 코딩이 단순히 경쟁적인 접근 방식이 아닌 문제를 설계하려고 시도 할 수 있습니다. 생성해야 할 객체가 충분히 크고 압축되지 않으면 코드에 하나의 예제를 넣으면 유효한 솔루션을 무작위로 생성하는 알고리즘을 작성하는 것보다 더 많은 바이트가 필요합니다. 특정 예에서, 물론 ID 행렬은 유효하고 일반적으로 생성하기 쉽지만 다른 문제의 경우에는 그렇지 않기 때문에 물론 그렇지 않습니다. 대상 객체가 충분히 불규칙한 경우 큰 크기를 요구하면 실제 알고리즘의 바이트 수에는 영향을 미치지 않지만 하드 코딩 된 부분이 날아갑니다.

출력 매개 변수화

종종 이러한 문제는 예제의 매트릭스 크기와 같은 하나 이상의 자연 매개 변수와 함께 제공됩니다. 그렇다면 하드 코딩이 불가능하거나 적어도 비실용적이되도록 해당 매개 변수를 입력으로 충분할 수 있습니다. 경우에 따라 수동 또는 광범위한 검색을 통해 제공된 특정 매개 변수 값에 대해 특정 솔루션 하나를 하드 코딩하는 것이 쉽지만 일반적으로 이러한 솔루션의 인스턴스에 대한 간단한 닫힌 형태가 없기 때문에 그렇지 않습니다. 임의의 입력에 대한 기본값을 쉽게 생성 할 수 있습니다. 아이덴티티 매트릭스는 어떤 크기로든 작동하기 때문에이 예제에서는 그렇지 않습니다. 이 관련 문제에일반적으로 매우 불규칙적이므로 유효한 값을 적극적으로 검색하지 않으면 기본값을 가질 수 없습니다. 이 값을 시간 제한과 결합하여 기본값에 대한 무차별 검색을 피할 수 있습니다.

확률 분포에 약간의 제한을 두십시오

완전히 제한되지 않은 확률 분포를 기꺼이 포기하려는 경우 응답자에게 분포를 선택할 때 많은 자유를 주지만 하드 코딩을 어렵거나 불가능하게 만드는 제약 조건을 둘 수 있습니다.

  • 생각할 수있는 가장 간단한 제약은 가능한 출력이 특정 임계 값 미만이되도록 최소 및 최대 확률의 차이를 요구하는 것입니다. 하드 코딩 된 접근 방식은 거의 모든 출력에 대해 확률이 거의 0이고 기본값에 대한 확률은 1에 가깝습니다. 최대 차이가 0.1 미만이어야하는 경우 접근 방식을 옵션으로 설정하려면 10 (임의로 선택) 기본값이 필요합니다. 마찬가지로 1 / (2 * N *)와 같이 가능한 각 출력에 대해 최소 확률을 요구할 수도 있습니다. 여기서 N 은 가능한 출력 수입니다.
  • 대안으로, 확률에 더 높거나 낮은 확률이 존재하도록 크기 δ (선택한)의 간격이 없도록 분포에 (가능성) 격차가 없도록 요구할 수 있습니다. 즉, 하드 코딩 방식으로 생성 될 가능성이있는 특이 치가있을 수 없습니다.

이러한 접근 방식의 주된 문제는 추론하기가 훨씬 어려워서 답변의 정확성을 입증하기가 어렵고 실험적으로 큰 출력 공간에서 정확성을 검증하는 것이 불가능하다는 것입니다. 그럼에도 불구하고, 이들은 하드 코딩을 불가능하게 할 수있는 프로그램에 대해 주로 관찰 가능한 요구 사항을 제공합니다.

기본값이 아닌 값의 확률을 높이는 한 가지 방법은 기본값으로 돌아 가기 전에 임의의 foo를 여러 번 찾으려고 시도하기 때문에 이러한 방법에는 시간 제한이 필요할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.