“무작위”이해


829

나는 이것에 대해 내 머리를 얻을 수 없다.

rand()

또는 :

rand() * rand()

나는 그것이 진짜 두뇌 맛보기를 찾는 중이 야, 당신은 나를 도울 수 있습니까?


편집하다:

직관적으로 나는 수학적인 대답이 그것들이 똑같이 무작위라는 것을 알고 있지만, 도움이 될 수는 없지만 두 개의 곱셈을 할 때 "임의의 숫자 알고리즘을 두 번 실행하면 더 무작위로 무언가를 만들 것이라고 생각합니다." 한 번.


162
"더 랜덤"이란 무엇입니까?
dan04

55
다른 사람들이 말했듯이,이 두 수량은 같은 분포를 가지고 있지 않습니다. 실제로받는 배포판 은 mathworld.wolfram.com/UniformProductDistribution.html 을 참조하십시오 . 간격의 모든 값이 동일 할 가능성이있는 단일 균일 난수와이를 비교하여 확률 밀도 함수는 수평 직선입니다.
bnaul

44
Daily WTF 에서 Random Stupidity 를 읽는 것이 좋습니다 . 특히이 새로운 난수의 출력을 분석하는 주석을 읽으십시오 . 그로부터 제거해야 할 메시지는 다음과 같습니다. 난수에 대한 임의의 연산이 반드시 임의의 출력을 생성하지는 않습니다 .
detly

51
또한 : 직관적으로 나는 수학적인 답이 그것들이 똑같이 무작위라는 것을 알고 있습니다. 만약 당신이 직관만으로 수학을 할 수 있다면, 우리는 그 피 묻은 상징을 모두 필요로하지 않을 것입니다 : P
detly

92
같은 당사자에게 통계와 직감을 가져 가지 마라 ....
Dr. belisarius

답변:


1481

설명 만

의사 난수 변수의 임의성 또는 곱셈을 발견하려고 할 때마다 이전 답변이 옳지 만 Random () 은 일반적으로 균일하게 분포되어 있지만 Random () * Random () 은 그렇지 않습니다.

이것은 의사 랜덤 변수를 통해 시뮬레이션 된 균일 한 랜덤 분포 샘플입니다 .

랜덤 히스토그램 ()

        BarChart[BinCounts[RandomReal[{0, 1}, 50000], 0.01]]

이것은 두 개의 임의 변수를 곱한 후 얻는 분포입니다.

랜덤 히스토그램 () * 랜덤 ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] * 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

따라서 둘 다“무작위”이지만 그 분포는 매우 다릅니다.

또 다른 예

2 * Random () 이 균일하게 분포되어 있는 동안 :

2의 히스토그램 * 랜덤 ()

        BarChart[BinCounts[2 * RandomReal[{0, 1}, 50000], 0.01]]

랜덤 () + 랜덤 ()은 아닙니다!

랜덤 히스토그램 () + 랜덤 ()

        BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + 
                                 RandomReal[{0, 1}, 50000], {50000}], 0.01]]

중앙 한계 정리

중심 극한 정리는 의 합한다고 랜덤 () A와 경향이 정규 분포 용어 증가로.

단 4 개의 용어 만 있으면 얻을 수 있습니다.

랜덤 () + 랜덤 () + 랜덤 () + 랜덤 ()의 히스토그램

BarChart[BinCounts[Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000] +
                   Table[RandomReal[{0, 1}, 50000] + RandomReal[{0, 1}, 50000],
                   {50000}],
         0.01]]  

그리고 여기에 1, 2, 4, 6, 10 및 20 개의 균일하게 분포 된 랜덤 변수를 더하여 균일 분포에서 정규 분포로가는 길을 볼 수 있습니다.

다른 수의 랜덤 변수 히스토그램 추가

편집하다

몇 크레딧

의견에서 마지막 두 이미지에 표시된 확률 분포가 Irwin-Hall 분포 라고 알려진 Thomas Ahle 에게 감사드립니다.

그녀의 훌륭한 찢어진 [] 기능에 대한 Heike 덕분에


41
+1. OP가 아마도 균일 한 분포를 원했기 때문에 이것이 정답 일 것입니다. 그리고 당신이한다면 rand()+rand(), 당신은 팻 센터를 가진 "2d6"형 분포로 끝날 것입니다.
Thilo

8
이것은 매우 흥미 롭습니다. 그러나 그것은 반 직관적 인면에서 저를 죽입니다. 배포에 대해 조금 더 읽은 후 좀 더 철저하게 살펴 보겠습니다. 대단히 감사합니다!
Trufa

46
@Trufa : 어쩌면 이것은 적어도 합계에 대해 직감의 일부에 도움이 될 것입니다. 하나의 롤 주사위의 "평균"을 취하는 것을 상상해보십시오. 이제 두 주사위의 평균을 취하는 것을 상상해보십시오. 이제 백입니다. 주사위를 더 많이 넣을 때 평균으로 1 또는 6을 얻을 확률은 어떻게됩니까?
johncip

3
@matt b 차트는 Mathematica의 1 개 라이너입니다. 코드는 각 그래프 앞에 굵게 표시된 텍스트입니다. Mathematica는 Plots를하기위한 멋진 언어입니다!
Dr. belisarius

4
@thenonhacker : 그렇습니다. 히스토그램은 편견을 보여 주지만 비 랜덤 성을 나타내지는 않습니다. 편향된 난수는 난수가 아닙니다. 사용자의 원래 질문에 대한 정답은 "영리하지 말고 상황을 악화시킬뿐입니다."라고 말하면이 대답이 그 요점을 넘어갑니다.
Kennet Belenky

151

내 gutfeel은 rand() * rand()더 많은 0을 시드하기 때문에 덜 무작위 적이 라고 말하지만 두 방법 모두 무작위입니다. 하나 rand()가 되 자마자 0총계는0


18
이 스트립을 사용하는 모든 답변에 대한 나의 대답은 다음과 같습니다. 나는 유머를 좋아하지만 CW 여야 합니다!
Andreas Rejbrand

4
@Andomar : 아뇨. 전혀. CW가 뭔지 알아?
Andreas Rejbrand

17
@Andreas Rejbrand : CW는 답변을하는 사람들에 대한 명성을 부정함으로써 흥미로운 질문을 죽이는 무기입니다. 그것처럼 보인다는 nerfed 가지고 meta.stackexchange.com/questions/392/... (이 흥미로운 질문이 튀어 나올 이유는 아마도!)
Andomar

11
@Andomar-그렇습니다. CW는 흥미로운 질문을 제거하지만 ( FAQ에서 ) "평판은 커뮤니티가 당신을 얼마나 신뢰 하는지를 대략적으로 측정 한 것입니다." 답변에 재미 있고 저작권이있는 이미지 를 포함 시키면 답변이 멋지다고 생각할 것입니다. 아마 당신 도 멋지다고 생각할 것입니다 . 그러나 더 신뢰할만한 가치는 없습니다. 수여되어야한다. CW를 의미하든, 투표에 참여하지 않아야하는지의 여부는 또 다른 문제입니다.
Richard JP Le Guen

13
만화의 "무작위 생성기"트롤은 π를 인용하고 Feynman 지점 에 도달하는 것만으로도 유리할 수 있습니다 . btw, π 자리는 무작위입니까? :)
mykhal

82

'더 무작위적인'것도 아닙니다.

rand()의사 난수 시드 (일반적으로 현재 시간을 기반으로 항상 변경됨)를 기반으로 예측 가능한 숫자 세트를 생성합니다. 시퀀스에서 두 개의 연속 숫자를 곱하면 서로 다르지만 똑같이 예측 가능한 숫자 시퀀스가 ​​생성됩니다.

이것이 충돌을 줄 일지에 대한 답은 아니오입니다. 실제로 두 개의 숫자를 곱하면 충돌이 증가 0 < n < 1합니다. 결과는 더 작은 분수가되어 스펙트럼의 하단을 향한 결과에 치우침이 발생합니다.

몇 가지 추가 설명. 다음에서 '예측 불가능'과 '임의'는 다음 숫자가 이전 숫자를 기반으로 무엇을 추측 할 수있는 능력을 말합니다. 오라클.

x다음과 같은 값 목록을 생성하는 시드가 제공됩니다.

0.3, 0.6, 0.2, 0.4, 0.8, 0.1, 0.7, 0.3, ...

rand()위의 목록 rand() * rand()을 생성 하고 다음 을 생성합니다.

0.18, 0.08, 0.08, 0.21, ...

두 방법 모두 항상 동일한 시드에 대해 동일한 숫자 목록을 생성하므로 오라클에 의해 동일하게 예측할 수 있습니다. 그러나 두 호출을 곱한 결과를 살펴보면 0.3원래 순서의 적절한 분포에도 불구하고 모두 호출 상태가 아님을 알 수 있습니다 . 두 분수를 곱한 결과 숫자가 치우칩니다. 결과 숫자는 항상 더 작으므로 여전히 예측할 수 없지만 충돌 가능성이 훨씬 높습니다.


9
+1 반면에 rand()+rand()+rand()..."임의의 랜덤"이 점점 더 낮아진다는 점에 유의하십시오 (임의의 경우 균일하게 분포 됨).
Thilo

4
@Thilo 아니, 그렇지 않아 ...? 임의의 변수가 (0,1) 범위에서 균일하게 분포되어 있고 변수를 n 번 샘플링하고 합계를 취하면 (0, n) 범위에서 균일하게 분포됩니다.
user359996

5
@Trufa rand()는 실제로 무작위 임을 신뢰 하고 무작위성을 '강화'하려고 시도하지 마십시오. 시드를 여러 번 설정하지 마십시오. 반 임의 자체라면 모든 개별 종자는 완벽하게 괜찮습니다. 내가 본 많은 구현들은 유닉스 시대를 시드로 사용하는데, 이것은 시드 (seed)로 매 초마다 바뀌며 바뀔 때마다 고유합니다.
Matthew Scharley

61
@ user359996 rand () + rand ()가 균일하게 배포되지 않았습니다. 주사위 2 개를 추가하면 2보다 7이 더 높습니다.
Liam

4
@thenonhacker 내 게시물에서 임의성에 대한 정의를 확인하십시오. 값이 스펙트럼의 한쪽 끝을 향하는 경향이 있기 때문에 생성 된 정확한 값에 대한 예측 가능성이 증가하지 않습니다. 그런 다음 편견 문제를 별도로 해결하기 위해 계속했습니다.
Matthew Scharley

80

요점을 설명하기 위해 지나치게 단순화했습니다.

당신의 임의 기능은 출력 가정 0이나 1.

random()중 하나입니다 (0,1),하지만 random()*random()중 하나입니다(0,0,0,1)

당신은 0두 번째 경우에 기회를 얻는 것이 결코 그렇지 않다는 것을 분명히 알 수 있습니다 1.


이 답변을 처음 게시했을 때 가능한 한 짧게 유지하여 그것을 읽는 사람이 random()and 의 차이점을 한눈에 이해할 random()*random()수 있도록했지만 원래 광고 리터럴 질문에 대답하지 못합니다.

어느 것이 더 무작위입니까?

즉,이기 때문에 random(), random()*random(), random()+random(), (random()+1)/2또는 고정 된 결과를 유도하지 않는 임의의 다른 조합 (의사 난수 발생기의 경우 또는 동일한 초기 상태) 엔트로피 같은 소스를 가지고 응답들이 있다는 것이 동일 (차이 임의 그들의 배포에 있습니다). 우리가 볼 수있는 완벽한 예는 Craps 게임입니다. 당신이 얻을 수있는 숫자 random(1,6)+random(1,6)는 7이 될 확률이 가장 높다는 것을 알고 있지만 두 주사위를 굴린 결과가 하나를 굴리는 결과보다 다소 무작위 적이라는 것을 의미하지는 않습니다.


"다른 분포에서 동일하게 무작위로"까다로운 까다로운 것을 압축하여 +1 매우 우아합니다.
Jens Roland

3
따라서 기술적으로 (random () * 0 + 9)는 1 요소 세트에서 값을 임의로 반환하므로 [9]와 동일하게 무작위입니다. 딜버트 만화가 옳았습니다.
Jens Roland

2
@Jens Rolan "고정 결과를 얻지 못하는 다른 조합";). 999999 <i> 아마도 </ i>는 임의로 생성되지 않으며 임의로 생성 될 가능성을 계산할 수 있습니다.
Alin Purcaru

69

간단한 답변이 있습니다. 독점을 고려하십시오. 당신은 2 개의 6면 주사위 (또는 게임 표기법을 선호하는 사람들을 위해 2d6)를 굴려서 합산합니다. 7 (1,6 2,5 3,4 4,3 5,2 및 6,1)을 롤링 할 수있는 6 가지 방법이 있기 때문에 가장 일반적인 결과는 7입니다. 반면 2는 1,1에서만 굴릴 수 있습니다. 범위가 동일하더라도 2d6 롤링이 1d12 롤링과 다르다는 것을 쉽게 알 수 있습니다 (1d12에서 1을 얻을 수 있다는 점을 무시하면 포인트는 동일 함). 결과를 더하는 대신 곱하면 비슷한 방식으로 왜곡되며 결과의 대부분은 범위의 중간에 나타납니다. 특이 치를 줄이려는 경우이 방법이 좋은 방법이지만 균일 한 분포를 만드는 데 도움이되지 않습니다.

(이상하게도 충분히 낮은 롤을 증가시킬 것입니다. 임의성이 0에서 시작한다고 가정하면 다른 롤이 0으로 바뀌기 때문에 0에서 급등한 것을 볼 수 있습니다. 0과 1 사이의 임의의 두 숫자를 고려하십시오 (포함) ) 및 곱하기 결과 중 하나가 0이면 다른 결과에 관계없이 전체가 0이됩니다 .1을 얻는 유일한 방법은 두 롤이 모두 1이되는 것입니다. 실제로 이것은 중요하지 않을 것입니다 그러나 그것은 이상한 그래프를 만듭니다.)


4
"결과를 더하는 대신 곱하면 비슷한 방식으로 결과가 왜곡되고 결과의 대부분이 범위의 중간에 오게됩니다." -벨리 사리우스의 대답에서 두 번째 그래프와 비교하여이 주장을 확인하십시오.
Daniel Earwicker

52

의무적 인 xkcd ...
리턴 4;  // 공정한 주사위 굴림에 의해 선택되며 무작위 임.


7
danmn 이것은 "무작위가 나타납니다"라는 단어가 나타날 때 항상 나타납니다 :)
Trufa

9
나는 유머를 좋아하지만 CW 여야 합니다.
Andreas Rejbrand

2
@Andreas Rejbrand-왜이 "유머"가 CW 여야합니까?
warren

16
CW가 아닌 경우 평판은 투표 될 때마다 답변 포스터를 인식합니다 (지금까지 160 명). 이제 평판은 학교의 성적과 같습니다. 기술적 인 능력 (이 경우 프로그래밍) 능력의 증명서 여야합니다. 따라서 쉽게 반박 될 수 있지만 그러한 능력이 필요없는 것을 게시하여 평판을 얻을 수 없어야합니다. 또한 평판 점수는 사용자의 권한을 결정합니다. 예를 들어, 10,000 점에서 사용자는 StackOverflow에서 운영 도구에 액세스 할 수 있습니다.
Andreas Rejbrand

35

좀 더 이산적인 숫자로 생각하면 도움이 될 것입니다. 1에서 36 사이의 난수를 생성하고 싶을 때 가장 쉬운 방법은 두 개의 공정한 6면 주사위를 던지는 것입니다. 당신은 이것을 얻는다 :

     1    2    3    4    5    6
  -----------------------------
1|   1    2    3    4    5    6
2|   2    4    6    8   10   12
3|   3    6    9   12   15   18
4|   4    8   12   16   20   24   
5|   5   10   15   20   25   30
6|   6   12   18   24   30   36

그래서 우리는 36 개의 숫자를 가지고 있지만, 그것들 모두가 공정하게 대표되는 것은 아니며, 일부는 전혀 발생하지 않습니다. 중앙 대각선 근처 (왼쪽 아래 모서리에서 오른쪽 위 모서리까지)의 숫자가 가장 높은 빈도로 발생합니다.

주사위 사이의 불공평 한 분포를 설명하는 동일한 원칙은 0.0과 1.0 사이의 부동 소수점 수에 동일하게 적용됩니다.


3
더 구체적으로, 난수를 곱할 때 분포의 변화를 보여주기 위해 +1. 이 행렬은 단어 나 분포 그래프 이상의 것을 도왔습니다.
Marjan Venema

26

"무작위"에 대한 몇 가지 사실은 반 직관적입니다.

플랫 분포를 가정하면 rand()다음과 같이 플랫하지 않은 분포를 얻을 수 있습니다.

  • 높은 편견 : sqrt(rand(range^2))
  • 중간에 바이어스 피크 : (rand(range) + rand(range))/2
  • 낮음 : 바이어스 : range - sqrt(rand(range^2))

특정 바이어스 곡선을 만드는 다른 방법이 많이 있습니다. 나는 빠른 테스트 rand() * rand()를 수행했으며 매우 비선형 분포를 얻습니다.


24

대부분의 rand () 구현에는 일정 기간이 있습니다. 즉, 엄청난 수의 호출 후에 시퀀스가 ​​반복됩니다. rand() * rand()절반의 시간 에 반복되는 출력 시퀀스는 그런 의미에서 "임의적"이 아닙니다.

또한, 신중하게 구성하지 않으면, 임의의 값에 대해 산술을 수행하는 것이 임의성을 덜 발생시키는 경향이 있습니다. 위의 포스터는 " rand()+ rand()+ rand()..."(예 : k 배)를 인용 했는데, 실제로는 값 범위의 평균 값의 k 배를 rand()반환 하는 경향이 있습니다. (그 의미에 대해 대칭적인 단계가있는 무작위 산책입니다.)

rand () 함수가 [0,1) 범위에서 균일하게 분포 된 임의의 실수를 리턴한다고 구체적으로 가정하십시오. (예,이 예는 무한 정밀도를 허용합니다. 결과를 변경하지는 않습니다.) 특정 언어를 선택하지 않고 다른 언어가 다른 작업을 수행 할 수 있지만 다음 분석은 rand의 비 언어 구현에 대한 수정 사항으로 유지됩니다 ( ). 또한 제품 rand() * rand()의 범위는 [0,1)이지만 더 이상 균일하게 분포되지 않습니다. 실제로, 제품은 간격 [1 / 4,1)에서와 같이 간격 [0,1 / 4)에있을 가능성이 높습니다. 곱셈이 많을수록 결과가 0으로 갈수록 왜곡됩니다. 결과가 더 예측 가능합니다. 넓은 뇌졸중에서 더 예측 가능한 == 적은 무작위.

균일하게 임의의 입력에 대한 거의 모든 작업 시퀀스는 불균일하게 임의적이어서 예측 성이 향상됩니다. 주의를 기울이면이 속성을 극복 할 수 있지만 산술 시간을 낭비하지 않고 실제로 원하는 범위에서 균일하게 분포 된 난수를 생성하는 것이 더 쉬웠을 것입니다.


나는 그 생각도 랜덤 생성기 기간을 두 배 빠르게 진행할 것이라고 생각했다.
Jared Updike

3
시퀀스 길이는 짝수 인 경우 반으로 만 줄어 듭니다. 홀수이면 r1 * r2, r3 * r4, ..., rn * r1, r2 * r3, r4 * r5가 표시되며 총 길이는 동일합니다.
Jander

23

"무작위"대 "더 무작위"는 어떤 0이 더 0인지 묻는 것과 약간 같습니다.

이 경우 randPRNG이므로 완전히 무작위가 아닙니다. (실제로 씨앗이 알려진 경우 상당히 예측 가능합니다). 다른 값을 곱하면 더 이상 무작위가 아닙니다.

실제 암호화 유형 RNG는 실제로 임의입니다. 그리고 어떤 종류의 함수를 통해 값을 실행하면 더 많은 엔트로피를 추가 할 수 없으며 엔트로피를 제거하여 더 이상 무작위로 만들 수 없습니다.


3
각 호출이 다른 값을 반환하기 때문에 이것은 제곱이 아닙니다. 다른 모든 것은 정확합니다.
Matthew Scharley

2
@thenonhacker : 자신의 설명에 따라 시퀀스 "1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10 , 1,2,3,4,5,6,7,8,9,10 ... "는 무작위입니다. 모든 숫자가 공정한 기회를 얻음으로써 균등하게 분배됩니다. 피킹 또는 바이어스가 없습니다. 그 시퀀스를 무작위로 생각합니까? 정의를 변경해야합니다. 랜덤은 출력에 관한 것이 아니며 랜덤은 출력 을 생성하는 데 사용되는 프로세스 에 관한 것 입니다.
abelenky

2
@CurtainDog : 텍스트 압축은 엔트로피 레벨을 동일하게 유지하면서 동일한 양의 엔트로피를 표현하는 데 필요한 비트 수를 줄입니다.
Kennet Belenky

4
@thenonhacker, @abelenky : 심지어 배포판도 쉽습니다. 난수 생성기에서 중요한 것은 난수 생성기 상태의 비트 수입니다. 제로 상태 난수 생성기 (예 : 4, 4, 4, 4, 4, ...)는 완전히 예측 가능합니다. 1 회용 패드는 생성되는 값의 수만큼 많은 상태를 가지므로 예측이 불가능합니다. 두 개의 PNRG의 컨벌루션은 공분산을 뺀 양보다 많은 비트 수의 엔트로피를 가진 PNRG를 생성합니다.
Kennet Belenky

1
@ Kennet-고마워, 당신은 나를 위해 그것을 크게 정리했습니다. @abelenky-멋지다.
CurtainDog

20

당신이 찾고있는 개념은 "엔트로피", 일련의 비트의 무질서의 "도"입니다. 이 아이디어는 "최대 엔트로피"개념으로 이해하기가 가장 쉽습니다.

최대 엔트로피를 갖는 비트 열에 대한 대략적인 정의는 더 짧은 비트 열로 정확하게 표현 될 수 없다는 것입니다 (즉, 작은 알고리즘을 사용하여 작은 문자열을 원래 문자열로 다시 확장).

최대 엔트로피와 임의 성과의 관련성은 "임의로"숫자를 선택하면 비트 문자열이 최대 엔트로피를 갖는 것에 가까운 숫자, 즉 압축 할 수없는 숫자를 거의 확실하게 선택한다는 사실에서 비롯됩니다. 이것은 "무작위"숫자의 특징이 무엇인지에 대한 최선의 이해입니다.

따라서 임의의 "두 번"인 두 개의 임의 샘플 중 임의의 숫자를 만들려면 두 비트 문자열을 함께 연결 해야합니다. 실제로 샘플을 이중 길이 단어의 상위 및 하위 절반에 넣습니다.

좀 더 실용적인 메모로, 엉뚱한 rand ()로 안장을 찾은 경우 때로는 두 개의 샘플을 함께 묶는 데 도움이 될 수 있습니다.


2
나는 xor를 통한 난수 생성에 대해 생각한 적이 없지만 개념을 꽤 멀리 취할 수 있다고 생각합니다 ( en.wikipedia.org/wiki/Mersenne_twister )! 답변 해주셔서 감사합니다.
가브리엘 미첼

1
난 정말이 대답을 grok 수하기 위해 사투를 벌인거야 ...에 주어진 답변에 의해 격파 최대 엔트로피 아닌가 stackoverflow.com/questions/3956478/understanding-randomness/...stackoverflow.com/questions/3956478/understanding-randomness/...은 . 이 경우 선택한 번호를 압축 할 수 없지만 임의로 불렀을 때 누르기가 어려울 수 있습니다.
CurtainDog

1
+1 허용되는 답변이 아름답습니다. 이것이 제가 가장 좋아하는 것입니다. 컴퓨터에 관해서는 항상 비트 단위로 생각하십시오. 실제로 생각하는 것보다 혼란스럽고 관련성이 적습니다. (나는 내 ​​대답을 썼고 이것을 발견했다. 그래서 나의 것은 이것의 확장에 지나지 않는다-아마도 엔트로피가 추가되었을 것이다).
Daniel Earwicker

1
@CurtainDog xkcd의 난수 4또는 이진수 0100는 0 비트로 압축 될 수 있습니다. 압축 해제 프로그램은 단순히 '4'를 반환합니다. 그보다 덜 무작위 적이지는 않습니다. dilbert의 문제점은 0 비트로 압축 할 수 있는지 알 수 없다는 것입니다 (항상 '9'를 반환하여 압축 해제). 8을 반환 할 수도 있고 1 비트로 압축 할 수 있습니다. 압축 풀기 : 0-> 9, 1-> 8. 랜덤 비트는 1입니다.
Ishtar

14

허용되는 답변은 매우 아름답지만 질문에 대답하는 다른 방법이 있습니다. PachydermPuncher의 답변은 이미이 대안을 취하고 있으며 조금 확장하겠습니다.

정보 이론에 대해 생각하는 가장 쉬운 방법은 정보의 최소 단위 인 단일 비트입니다.

C 표준 라이브러리 에서 플랫폼에 따라 다르게 정의 될 수있는 한계 인 rand()0-범위의 정수를 리턴합니다 RAND_MAX. 정수가 있는 위치 RAND_MAX로 정의 되었다고 가정 합니다 ( 15 의 경우 Microsoft 구현의 경우 ). 그런 다음 좋은 구현은 정보의 비트를 반환한다고 말할 것 입니다.2^n - 1nnn

rand()동전을 뒤집어 1 비트의 값을 찾은 다음 15 비트의 배치가 될 때까지 반복하여 임의의 숫자 를 구성 한다고 상상해보십시오 . 그런 다음 비트는 독립적입니다 (한 비트의 값은 동일한 배치의 다른 비트가 특정 값을 가질 가능성에 영향을 미치지 않음). 따라서 독립적으로 간주되는 각 비트는 0과 1 사이의 임의의 숫자와 같으며 해당 범위에 걸쳐 "균등하게 분배"됩니다 (0과 1 일 가능성이 있음).

비트의 독립성은 비트 배치로 표시되는 숫자가 해당 범위에 균등하게 분배되도록합니다. 15 비트가 있으면 허용되는 범위는 0에서 2^15 - 132767 사이입니다. 해당 범위의 모든 숫자는 다음과 같은 고유 한 비트 패턴입니다.

010110101110010

비트들이 독립적이라면 어떤 패턴도 다른 패턴보다 더 발생하지 않을 것이다. 따라서 범위 내의 모든 가능한 숫자는 동일하게 가능합니다. 그리고 그 반대의 경우도 마찬가지입니다. rand()균일하게 분포 된 정수를 생성하면 해당 숫자는 독립 비트로 구성됩니다.

따라서 rand()비트를 만들기위한 생산 라인 이라고 생각하면 됩니다. 비트는 임의 크기의 배치로 제공됩니다. 크기가 마음에 들지 않으면 배치를 개별 비트로 분할 한 다음 원하는 양으로 다시 정리하십시오 (2의 거듭 제곱이 아닌 특정 범위가 필요하더라도 숫자를 줄여야합니다) 가장 쉬운 방법은 부동 소수점으로 변환하는 것입니다).

원래 제안으로 돌아가서 15 개 배치에서 30 개 배치로 이동 rand()하고 첫 번째 숫자를 요청 하고 15 자리 씩 비트 시프트 한 다음 다른 위치에 추가 rand()한다고 가정합니다. 이는 rand()균일 한 분배를 방해하지 않고 두 호출을 결합하는 방법 입니다. 정보 비트를 배치하는 위치간에 겹치지 않기 때문에 간단하게 작동합니다.

이것은 rand()상수를 곱하여 범위를 "스트레칭"하는 것과는 매우 다릅니다 . 예를 들어, 범위를 두 배로 늘리려면 rand()2를 곱할 수 있지만 이제는 짝수 만 받고 홀수는 안됩니다! 그것은 정확히 매끄럽게 배포되지는 않으며 응용 프로그램에 따라 심각한 문제가 될 수 있습니다. (비트 관점에서 생각하면, 실수를 직관적으로 피할 수 있습니다. 2를 곱하는 것이 비트를 한 자리 씩 왼쪽으로 옮기고 (더 큰 의미) 0으로 간격을 채우는 것과 동일하다는 것을 알기 때문입니다. 따라서 분명히 정보의 양은 동일합니다-조금 움직였습니다.)

부동 소수점 범위에는 본질적으로 단순히 표현할 수없는 간격이 있기 때문에 숫자 범위의 이러한 차이는 부동 소수점 숫자 응용 프로그램에서 파악할 수 없습니다. 두 개의 표현 가능한 부동 소수점 사이의 간격 에는 무한한 누락 된 실수가 존재합니다. 포인트 번호! 어쨌든 우리는 단지 틈새로 사는 법을 배워야합니다.

다른 사람들이 경고했듯이,이 분야에서는 직관이 위험합니다. 특히 수학자들은 극심한 무한 성과 명백한 역설로 가득 찬 것들을 끔찍하게 혼란스럽게하는 실수의 매력에 저항 할 수 없기 때문입니다.

그러나 적어도 비트로 생각하면 직감이 조금 더 나아질 수 있습니다. 비트는 정말 쉽습니다. 심지어 컴퓨터 조차도 이해할 수 있습니다.


3
+1 : 실제로, (수학적) 정수 전체에있는 숫자보다 두 개의 IEEE 배정 밀도 부동 소수점 사이에 누락 된 숫자가 더 많습니다.
Donal Fellows

13

다른 사람들이 말했듯이 쉬운 대답은 다음과 같습니다. 아니요, 더 무작위는 아니지만 분포를 변경합니다.

주사위 게임을하고 있다고 가정하자. 당신은 완전히 공정하고 무작위적인 주사위를 가지고 있습니다. 주사위를 던지기 전에 주사위 두 개를 먼저 그릇에 넣고 흔들어서 주사위 중 하나를 무작위로 고른 다음 주사위를 굴리면 주사위가 더 무작위로 나옵니까? 분명히 아무런 차이가 없습니다. 두 주사위가 임의의 숫자를 주면 두 주사위 중 하나를 무작위로 선택해도 아무런 차이가 없습니다. 어느 쪽이든 1에서 6 사이의 임의의 숫자를 얻을 수 있으며 충분한 수의 롤에 균일하게 분포됩니다.

나는 실제로 당신이 주사위가 불공평하다고 의심된다면 그러한 절차가 유용 할 것이라고 생각합니다. 예를 들어, 주사위의 균형이 약간 불균형하여 시간의 1/6보다 1을 더 자주주는 경향이 있고, 다른 1 개가 비정상적으로 자주 6을주는 경향이 있다면, 둘 사이에서 무작위로 선택하면 편견을 모호하게하는 경향이 있습니다. (이 경우에도 1과 6은 여전히 ​​2, 3, 4 및 5 이상이 될 것입니다. 글쎄, 나는 불균형의 본질에 따라 추측합니다.)

무작위성에 대한 많은 정의가 있습니다. 랜덤 시리즈의 한 가지 정의는 랜덤 프로세스에 의해 생성 된 일련의 숫자라는 것입니다. 이 정의에 따르면, 공정한 주사위를 5 번 굴리고 숫자 2, 4, 3, 2, 5를 얻는다면 그것은 무작위 시리즈입니다. 그런 다음 같은 공정한 주사위를 5 번 더 굴리고 1, 1, 1, 1, 1을 얻는다면 그것은 또한 무작위 시리즈입니다.

여러 포스터는 컴퓨터의 임의 함수가 실제로 임의가 아니라 의사 난수이며 알고리즘과 시드를 알고 있으면 완전히 예측할 수 있다고 지적했습니다. 이것은 사실이지만 대부분의 경우 완전히 관련이 없습니다. 카드 한 벌을 섞은 다음 한 번에 하나씩 뒤집 으면 임의의 일련이어야합니다. 누군가가 카드를 들여다 본다면 결과를 완전히 예측할 수 있지만 대부분의 무작위성 정의로 인해 덜 무작위 적이지는 않습니다. 시리즈가 무작위성에 대한 통계 테스트를 통과하면 카드를 들여다 본 사실은 그 사실을 변경하지 않습니다. 실제로, 우리가 다음 카드를 추측하는 능력에 대해 많은 돈을 도박으로한다면, 당신이 카드를 들여다 본 사실은 매우 관련이 있습니다. 시스템 성능을 테스트하기 위해 웹 사이트 방문자의 메뉴 선택을 시뮬레이트하기 위해이 시리즈를 사용하는 경우, 들여다 본 사실은 전혀 차이가 없습니다. (이 지식을 이용하기 위해 프로그램을 수정하지 않는 한)

편집하다

Monty Hall 문제에 대한 답변을 주석으로 작성할 수 없다고 생각하므로 답변을 업데이트하겠습니다.

Belisarius 링크를 읽지 않은 사람들에게는 그 요점은 다음과 같습니다. 게임 쇼 참가자에게는 3 개의 문이 있습니다. 그 뒤에는 가치있는 상이 있고, 다른 것 뒤에는 가치없는 것이 있습니다. 그는 문 # 1을 선택합니다. 승자인지 패자인지 공개하기 전에 주최자는 3 번 문을 열어 패자임을 공개합니다. 그런 다음 참가자에게 2 번 문으로 전환 할 수있는 기회를 제공합니다. 참가자가해야합니까?

많은 사람들의 직감을 불쾌하게하는 대답은 그가 전환해야한다는 것입니다. 그의 원래 선택이 승자 일 확률은 1/3이고 다른 문이 승자 일 가능성은 2/3입니다. 다른 많은 사람들과의 나의 직관은 전환에 아무런 이득이 없을 것이며, 확률은 50:50으로 바뀌 었다는 것입니다.

결국, 주인이 잃어버린 문을 열 자마자 누군가 TV를 켰다 고 가정하자. 그 사람은 두 개의 닫힌 문이 남아있을 것입니다. 그가 게임의 본질을 알고 있다고 가정하면, 각 문이 상금을 숨길 확률이 1/2이라고 말한다. 참가자의 확률은 어떻게 1/2 : 1/2이고 참가자의 확률은 1/3 : 2/3입니까?

내 직관력을 이겨내 기 위해 나는 이것에 대해 정말로 생각해야했다. 이에 대해 다루려면 이와 같은 문제에서 확률에 대해 이야기 할 때 사용 가능한 정보가 주어질 확률을 의미한다는 것을 이해하십시오. 문 1 번을 차지한 승무원은 1 번 문 뒤에 상품이 올 확률이 100 %이고 다른 두 문 중 하나에 올 확률이 0입니다.

승무원의 승률은 선수의 승률과 다릅니다. 마찬가지로, 참가자의 승률은 시청자의 승률과 다릅니다. 즉, 시청자가 모르는 것, 즉 그가 처음 선택한 문을 알고 있기 때문입니다. 호스트가 어떤 문을 열 것인지에 대한 선택은 무작위가 아니기 때문에 이것은 중요하지 않습니다. 그는 참가자가 선택한 문을 열지 않으며 상을 숨기는 문을 열지 않을 것입니다. 이것들이 같은 문이라면, 그에게 두 가지 선택이 남습니다. 그들이 다른 문이라면, 그것은 하나만 남습니다.

1/3과 2/3은 어떻게 되나요? 참가자가 처음 문을 열었을 때, 그는 1/3의 기회를 얻었습니다. 많은 것이 분명하다고 생각합니다. 이는 다른 문 중 하나가 승자가 될 확률이 2/3임을 의미합니다. 만약 주최자가 그에게 추가 정보를주지 않고 전환 할 수있는 기회가 있다면, 이득은 없을 것입니다. 다시, 이것은 분명해야합니다. 그러나 그것을 보는 한 가지 방법은 그가 전환함으로써 이길 가능성이 2/3라고 말하는 것입니다. 그러나 그는 두 가지 대안이 있습니다. 따라서 각 사람은 2/3를 2 = 1/3의 확률로 승자가 될 수 있습니다. 물론 우리는 이미 최종 결과를 알고있었습니다. 이것은 다른 방식으로 계산합니다.

그러나 이제 호스트는이 두 가지 선택 중 하나가 승자가 아님을 밝힙니다. 따라서 그가 선택하지 않은 문이 2/3 일 가능성이 승자가되었으므로 이제 2 가지 대안 중 하나가 그렇지 않다는 것을 알고 있습니다. 다른 사람은있을 수도 있고 아닐 수도 있습니다. 따라서 그는 더 이상 2/3로 2를 나누지 않습니다. 그는 열린 문에는 0이 있고 닫힌 문에는 2/3가 있습니다.


아주 좋은 비유! 나는 이것이 매우 좋은 평범한 영어 설명이라고 생각하며, 다른 많은 사람들과 달리 실제로 내 질문에 대답했습니다 :)
Trufa

@Trufa @Jay 사건과 무작위성에 대한 가능한 사전 지식 사이의 혼란은 매우 일반적입니다. 문제를 해결하고 아카데미에서 더 나은 수학자들에게 수치심을 떨친 여성에 대한이 흥미로운 이야기를 여러분과 나누겠습니다. 그들은 나중에 후회할 것들이 많이 있다고 말했다. 여기 당신의 고려 사항과 관련된 이야기가 있습니다 ... 즐기십시오! marilynvossavant.com/articles/gameshow.html
Dr. belisarius

트윗 담아 가기 나는 blackjack21 :) 그냥 농담 내가 포인트를 얻을 말한다!
Trufa

@ belisarius BTW는 내가 한 번도 얻지 못했습니다.
Trufa

@Trufa 그리고 여기 마릴린의 문에 학문적 인 반응을 보여주는 기사입니다 query.nytimes.com/gst/...를 (아주 아주 재미)
박사 벨리 사리우스

11

머리로 간주되고 홀수는 꼬리로 간주되는 간단한 동전 뒤집기 문제가 있다고 가정하십시오. 논리적 구현은 다음과 같습니다.

rand() mod 2

충분히 큰 분포에서 짝수의 수는 홀수의 수와 같아야합니다.

이제 약간의 조정을 고려하십시오.

rand() * rand() mod 2

결과 중 하나가 짝수이면 전체 결과가 균일해야합니다. 4 가지 가능한 결과 (* 짝수 = 짝수, 짝수 * 홀수 = 짝수, 홀수 * 짝수 = 짝수, 홀수 * 홀수 = 홀수)를 고려하십시오. 이제 충분히 큰 분포에서 답은 시간의 75 %가되어야합니다.

내가 너라면 머리를 걸었을 것이다.

이 주석은 무작위의 수학적 속성에 대한 토론보다 방법에 따라 사용자 정의 임의 함수를 구현해서는 안되는 이유에 대한 설명입니다.


1
조심해! rand()%2매우 무작위 적이 지 않을 수 있습니다. 저 비트의 무작위성에 따라 달라지며 일부 PRNG는 그렇게 좋지 않습니다. (물론 일부 언어에서는 부동 소수점 결과를 얻지 rand()못하므로 전혀 그렇게 할 수는 없습니다 ...)
Donal Fellows

10

난수의 조합에 어떤 일이 일어날 지 의문이있는 경우 통계 이론에서 배운 교훈을 사용할 수 있습니다.

OP의 상황에서 그는 X * X = X ^ 2의 결과가 무엇인지 알고 싶어합니다. 여기서 X는 Uniform [0,1]을 따라 분포 된 랜덤 변수입니다. CDF 기술은 일대일 매핑이기 때문에 사용할 것입니다.

X ~ Uniform [0,1]이므로 cdf는 다음과 같습니다. f X (x) = 1 변환 Y <-X ^ 2 그러므로 y = x ^ 2 변환 x (y)를 구합니다. sqrt (y) = x 이것은 우리에게 x를 y의 함수로 제공합니다. 다음 미분 dx / dy를 찾으십시오. d / dy (sqrt (y)) = 1 / (2 sqrt (y))

Y의 분포는 다음과 같이 주어진다 : f Y (y) = f X (x (y)) | dx / dy | = 1 / (2 제곱미터 (y))

아직 완료되지 않았으므로 Y의 도메인을 가져와야합니다. 0 <= x <1, 0 <= x ^ 2 <1이므로 Y는 [0, 1) 범위에 있습니다. Y의 pdf가 실제로 pdf인지 확인하려면 도메인을 통해 통합하십시오 .1 / (2 sqrt (y))를 0에서 1 로 통합하면 실제로 1로 나타납니다. 또한, 말했다 기능은 belisarious 게시 된 것 같습니다.

X 1 + X 2 + ... + X n (X i ~ Uniform [0,1])과 같은 것은 모멘트가 존재하는 분포에 대해 작동하는 중앙 한계 정리에 호소 할 수 있습니다. 이것이 Z- 테스트가 실제로 존재하는 이유입니다.

결과 PDF를 결정하는 다른 기술로는 Jacobian 변환 (cdf 기술의 일반화 된 버전)과 MGF 기술이 있습니다.

편집 : 설명 을 위해 결과 변환 의 분포 에 대해 이야기 하고 무작위성이 아니라는 점에 유의하십시오 . 그것은 실제로 별도의 토론입니다. 또한 실제로 파생 된 것은 (rand ()) ^ 2입니다. rand () * rand ()의 경우 훨씬 복잡하므로 어떤 경우에도 균일 한 분포가 발생하지 않습니다.


9

명확하지는 않지만 rand()일반적으로보다 무작위 rand()*rand()입니다. 중요한 것은 이것이 대부분의 용도에 실제로 중요하지 않다는 것입니다.

그러나 첫째, 서로 다른 분포를 만들어냅니다. 이것이 원하는 경우 에는 문제가되지 않지만 중요합니다. 특정 분포가 필요한 경우 "더 무작위적인"전체 질문을 무시하십시오. 왜 rand()더 무작위입니까?

이유의 핵심 rand()더 무작위 적입니다 ([0..1] 범위의 부동 소수점 난수를 생성한다는 가정하에 매우 흔함)는 두 개의 FP 숫자에 가수에 많은 정보를 곱하면 결국 정보의 일부 손실; IEEE 배정 밀도 플로트에는 [0..1]에서 균일하게 선택된 두 개의 IEEE 배정 밀도 플로트에있는 모든 정보를 담을 수있는 비트가 충분하지 않으며 추가 비트 정보가 손실됩니다. 물론, 아마도 그 정보를 사용하지 않았기 때문에 그다지 중요하지 않지만 손실은 실제로 발생합니다. 또한 어떤 배포판 (즉, 조합을 수행하는 데 사용하는 작업)도 중요하지 않습니다. 각 난수에는 52 비트의 난수 정보가 있습니다.

대부분의 난수 사용은 난수 소스에서 실제로 사용할 수있는만큼의 난수에 가깝게 사용되지 않습니다. 좋은 PRNG를 받고 그것에 대해 너무 걱정하지 마십시오. (“선도”의 수준은 사용하는 작업에 따라 달라집니다. Monte Carlo 시뮬레이션 또는 암호화를 수행 할 때는주의해야하지만 그렇지 않으면 표준 PRNG를 사용하는 것이 훨씬 빠릅니다.)


1
이 답변은 실제로 벨리 사리우스의 웅장한 답변과 함께 읽어야합니다. 그들은 문제의 다른 측면을 다룹니다.
Donal Fellows

7

부동 난수는 일반적으로 0에서 특정 범위 사이의 정수를 생성하는 알고리즘을 기반으로합니다. 따라서 rand () * rand ()를 사용하여 본질적으로 int_rand () * int_rand () / rand_max ^ 2를 말하고 있습니다. 이는 소수 / rand_max ^ 2를 제외하고 있음을 의미합니다.

이는 무작위 분포를 크게 바꿉니다.

rand ()는 대부분의 시스템에 균등하게 분포되어 있으며 제대로 시드되었는지 예측하기 어렵습니다. 수학을 계산해야 할 특별한 이유가없는 한 (예 : 분포를 필요한 곡선으로 형성)이를 사용하십시오.


@belisarius : 1이 랜덤 프로세스의 가능한 결과 인 경우에만 해당됩니다.
Joris Meys

나는 이것을 발견하기 전에 답을 먼 길을 읽어야했습니다. 명확한 문제는 다음과 같습니다. 결과 공간 (가능한 값의 수)은 소수를 제외하므로- rand()*rand()의 결과 공간보다 작습니다 rand(). 내 투표를 가져
옵니다

7

숫자를 곱하면 컴퓨터 아키텍처에 따라 더 작은 솔루션 범위가됩니다.

컴퓨터의 디스플레이에 16 자리 숫자 rand()가 0.1234567890123에 0.1234567890123을 곱 rand()하면 0.0152415가 10 ^ 14 회 실험을 반복하면 더 적은 해결책을 찾을 수 있습니다.


3

이러한 분포의 대부분은 난수를 제한하거나 정규화해야하기 때문에 발생합니다.

우리는 그것을 모두 양수, 범위 내에 맞추고 할당 된 변수 유형에 대한 메모리 크기의 제약 조건에 맞추도록 정규화합니다.

다시 말해, 0과 X 사이의 임의 호출을 제한해야하기 때문에 (X는 변수의 크기 제한 임) 0과 X 사이에 "임의"숫자 그룹이 생깁니다.

이제 임의의 숫자를 다른 임의의 숫자에 추가하면 합계는 0에서 2X 사이에 있습니다 ...이 값은 가장자리 지점에서 멀어집니다 (두 개의 작은 숫자와 두 개의 큰 숫자를 더할 확률은 매우 작습니다) 넓은 범위에 걸쳐 두 개의 난수가 있습니다).

0에 가까운 숫자가 있고 다른 임의의 숫자로 추가하면 확실히 커지고 0에서 멀어집니다 (이것은 큰 숫자의 경우와 두 개의 큰 숫자는 없을 것입니다) 랜덤 함수에 의해 두 번 리턴 된 (X에 가까운 숫자).

이제 음수와 양수 (제로 축을 따라 균등하게 스팬)로 임의의 방법을 설정하면 더 이상 그렇지 않습니다.

예를 들어 RandomReal({-x, x}, 50000, .01), 당신은 음의 양의 양의 균등 한 분포를 얻게 될 것이고, 만약 당신이 임의의 숫자를 더한다면 그것들은 그들의“무작위”를 유지할 것입니다.

이제 Random() * Random()음수에서 양의 범위로 어떤 일이 일어날 지 잘 모르겠습니다 ... 재미있는 그래프 일 것입니다 ...하지만 지금 코드 작성으로 돌아 가야합니다. :-피


2
  1. 무작위적인 것은 없습니다 . 무작위이거나 그렇지 않습니다. 랜덤은 "예측하기 어렵다"를 의미합니다. 비 결정적이라는 의미는 아닙니다. random () 및 random () * random ()은 random ()이 임의 인 경우 동일합니다. 무작위성이있는 한 분포는 관련이 없습니다. 균일하지 않은 분포가 발생하면 일부 값이 다른 값보다 가능성이 높다는 것을 의미합니다. 그들은 여전히 ​​예측할 수 없습니다.

  2. 의사 난 수성이 포함되므로 숫자는 매우 결정적입니다. 그러나 의사 난수는 확률 모델과 시뮬레이션에서 충분합니다. 의사 난수 생성기를 복잡하게 만드는 것만으로는 분석하기가 어렵다는 것은 잘 알려져 있습니다. 무작위성을 향상 시키지는 않습니다. 종종 통계 테스트에 실패합니다.

  3. 난수의 바람직한 특성은 중요하다 : 반복성 및 재현성, 통계적 랜덤 성, (일반적으로) 균일하게 분포되어 있으며, 큰 기간은 몇 가지이다.

  4. 난수 변환 관련 : 누군가 말했듯이, 둘 이상의 균일하게 분포 된 합은 정규 분포를 초래합니다. 이것은 추가 중심 제한 정리입니다. 모든 배포가 독립적이고 동일하다면 소스 배포와 상관없이 적용됩니다. 곱셈중심 한계 정리는 2 개 이상의 독립적이고 밀도 분포 된 랜덤 변수의 곱이 로그 정규라고 말합니다. 다른 사람이 만든 그래프는 지수 적으로 보이지만 실제로는 로그 정규입니다. 따라서 random () * random ()은 로그 정규 분포입니다 (숫자는 동일한 스트림에서 가져 오기 때문에 독립적이지 않을 수 있음). 일부 응용 프로그램에서는 바람직 할 수 있습니다. 그러나 일반적으로 하나의 난수를 생성하여 로그 정규 분포 숫자로 변환하는 것이 좋습니다. Random () * random ()을 분석하기 어려울 수 있습니다.

자세한 내용은 www.performorama.org에서 내 책을 참조하십시오. 이 책은 건설 중이지만 관련 자료가 있습니다. 장과 섹션 번호는 시간이 지남에 따라 변경 될 수 있습니다. 8 장 (확률 이론)-8.3.1 장과 8.3.3 장, 10 장 (무작위 수).


1

Kolmogorov의 복잡도 를 사용하여 임의성에 관한 두 개의 배열을 비교할 수 있습니다 . 수열을 압축 할 수 없다면,이 길이에서 도달 할 수있는 가장 무작위입니다. 선택권...


1

그것에 대해 사실, 때 생각 rand() * rand()입니다 적은 보다는 무작위 rand(). 이유는 다음과 같습니다.

기본적으로 짝수와 같은 수의 홀수가 있습니다. 0.04325는 홀수이고 0.388은 짝수이고 0.4는 짝수이고 0.15는 홀수라고합니다.

그 수단 rand()갖는 짝수 또는 홀수 소수되는 동일한 기회 .

반면에 rand() * rand()확률이 약간 다르게 쌓여 있습니다. 의 말을하자:

double a = rand();
double b = rand();
double c = a * b;

a그리고 b모두가 짝수 또는 홀수 인의 50 % 퍼센트 인의 기회가있다. 그것을 아는 것은

  • 짝수 * 짝수 = 짝수
  • 짝수 * 홀수 = 짝수
  • 홀수 * 홀수 = 홀수
  • 홀수 * 짝수 = 짝수

즉, 거기에 75 %의 확률c 만을하면서 짝수 25 %의 확률로 이 값 만드는 이상한 rand() * rand()이상의 예측이 rand()때문에 적은 랜덤.


rand()일반적으로 0과 1 사이의 숫자를 제공합니다. 짝수인지 홀수인지에 대해 이야기합니까?
Teepeemm

1
실제로, 0.2*0.2=0.04이 접근 방식의 근본적인 결함을 제안합니다. 두 비트의 53 비트를 곱하면 결과에 약 100 비트가 제공됩니다. 그러나이 비트의 마지막 절반은 버려집니다. 따라서 1을 최하위 비트로 두 번의 복식을 취하면 해당 제품의 최하위 비트에 대해 아무 것도 말할 수 없습니다.
Teepeemm

또는 다른 방법으로, 분포에 적합한 "짝수"및 "홀수" rand()의 정의는 분포에 적합한 "짝수"및 "홀수" 의 정의와 동일 하다고 가정했습니다. 의 rand()*rand(). 그렇지 않은 경우이 인수는 실패합니다. 정수에 대해서는 사실이지만 정수가 아닙니다.
David Schwartz

0

원시 다항식을 구현하는 선형 피드백 시프트 레지스터 (LFSR)를 사용하십시오.

결과는 2 ^ n 의사 난수의 시퀀스, 즉 n이 LFSR의 비트 수인 시퀀스에서 반복되지 않습니다. 균일 한 분포를 초래합니다.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

컴퓨터 시계의 마이크로 초를 기준으로 "랜덤"시드를 사용하거나 파일 시스템의 일부 데이터가 지속적으로 변경 될 때 md5 결과의 하위 집합을 사용하십시오.

예를 들어, 32 비트 LFSR은 주어진 시드 (seed)로 시작하여 2 ^ 32 개의 고유 번호를 순서대로 생성합니다. 순서는 항상 같은 순서이지만 시작점은 다른 씨앗에 대해 (분명히) 다릅니다. 따라서 시드 사이에 반복되는 순서가 문제가되지 않는 경우이 방법을 사용하는 것이 좋습니다.

128 비트 LFSR을 사용하여 지속적으로 변경되는 시스템 데이터에 대한 md5 결과 인 시드를 사용하여 하드웨어 시뮬레이터에서 무작위 테스트를 생성했습니다.


0

라고 가정 rand()사이 수 복귀 [0, 1)가 분명 rand() * rand()승산 때문이다 0 치우쳐 것 x사이의 숫자로하는 [0, 1)보다 작은 수를 초래할 것이다 x. 다음은 10000 개의 난수 분포입니다 .

경우 rand()반환의 정수는 [x, y]다음 다음과 같은 분포를 가지고있다. 홀수 대 짝수의 수를 확인하십시오.


-1

자, 난수 생성기를 사용하고 있다고 말함으로써 다른 답변을 보완하기 위해 값을 추가하려고합니다.

난수 생성기는 목적에 맞게 수정할 수있는 여러 특성을 갖는 장치 (일반적으로)입니다. 그들 중 일부는 (나에게서) :

  • 엔트로피 : Shannon Entropy에서와 같이
  • 분포 : 통계 분포 (포아송, 정규 등)
  • 유형 : 숫자의 소스 (알고리즘, 자연 이벤트, 조합 등)와 적용된 알고리즘은 무엇입니까?
  • 효율성 : 신속성 또는 복잡성.
  • 패턴 : 주기성, 시퀀스, 런 등
  • 그리고 아마도 더 ...

여기에서 대부분의 대답에서 분포는 주요 관심 사항이지만 함수와 매개 변수를 혼합하고 일치 시켜서 임의의 숫자를 생성하는 새로운 방법을 만들어 어떤 특성에 대해 다른 특성을 가지므로 언뜻보기에는 명확하지 않을 수 있습니다.


-1

두 난수의 합이 반드시 임의적 인 것은 아님을 쉽게 알 수 있습니다. 6면 다이와 롤이 있다고 상상해보십시오. 각 숫자는 1/6의 확률로 나타납니다. 주사위 2 개를 가지고 결과를 합산했다고 가정 해 봅시다. 이 합의 분포는 1/12가 아닙니다. 왜? 특정 숫자는 다른 숫자보다 더 많이 나타납니다. 여러 파티션 이 있습니다. 예를 들어 숫자 2는 1 + 1의 합이지만 7은 3 + 4 또는 4 + 3 또는 5 + 2 등에 의해 형성 될 수 있습니다.

따라서 변환을 적용하는 경우이 경우 임의 함수에 추가해도 더 임의적이지 않거나 반드시 임의성을 유지하지는 않습니다. 위의 주사위의 경우 분포가 7로 치우쳐 무작위성이 떨어집니다.


-1

다른 사람들이 이미 지적했듯이, 우리 모두는 그의 머리 에 무작위성 에 대한 자신 의 그림 이 있기 때문에이 질문 에 대답 하기가 어렵습니다 .

따라서 임의성에 대한 더 나은 아이디어를 얻으려면 시간을내어이 사이트를 읽어 보는 것이 좋습니다.

실제 질문으로 돌아갑니다. 이 용어에서 더 많거나 적은 무작위는 없습니다.

둘 다 무작위로 나타납니다 !

두 경우 모두 rand () 또는 rand () * rand ()-상황은 동일합니다. 수십억의 숫자 후에 시퀀스 가 반복됩니다 (!) . 이 나타납니다 그가 전체 순서를 모르기 때문에, 관찰자에 무작위로하지만, 컴퓨터가없는 진정한 임의의 소스를 - 그 중 하나 임의성을 생산하지 수 있습니다.

예 : 날씨가 무작위입니까? 날씨가 무작위인지 아닌지를 판단하기에 충분한 센서 나 지식이 없습니다.


-2

답은 rand () * rand ()가 rand ()보다 더 임의적이지만, 다음과 같이 결정됩니다.

  • 두 가지 답변은 값의 비트 크기에 따라 다릅니다.
  • 대부분의 경우 의사 난수 알고리즘 (대부분 컴퓨터 시계에 의존하는 숫자 생성기)에 따라 생성됩니다.
  • 코드를 더 읽기 쉽게 만드십시오 (그리고 이런 종류의 만트라로 임의의 부두 신을 무작위로 불러 내지 마십시오).

글쎄, 당신이 위의 것들 중 하나를 확인하면 나는 당신이 간단한 "rand ()"에 갈 것을 제안합니다. 코드가 더 읽기 쉽기 때문에 (왜 ... 2 초 이상 작성했는지 묻지 않을 것이므로) 유지 관리가 쉽습니다 (rand 함수를 super_rand로 바꾸려면).

더 나은 랜덤을 원한다면 충분한 노이즈를 제공하는 소스 ( 라디오 스태틱 ) 에서 스트리밍하는 것이 좋습니다. 그러면 간단 rand()합니다.

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