설날 D-3! 윷놀이용 난수 발생기
글쓴이: cppig1995 / 작성시간: 목, 2006/01/26 - 8:13오후
#include <stdlib.h>
typedef enum
{
YC_DO = 1,
YC_GAE = 2,
YC_GEOL = 3,
YC_YUT = 4,
YC_MO = 5,
} YUT_CASE;
YUT_CASE randomYutCase()
{
int n = rand() / (RAND_MAX / 160 + 1);
if(n < 40) return YC_DO;
if(n < 100) return YC_GAE;
if(n < 140) return YC_GEOL;
if(n < 150) return YC_YUT;
else return YC_MO;
}
다음은 여러분들의 활약이 기다리고 있습니다. :oops:
이 난수 발생기는 그냥 수학적 확률만을 기반으로 했으므로,
여러분이 평면 위 : 곡면 위의 확률이 3 : 2 라는 것에 기반하여
발전시켜 주세요. (이렇게 말하면 발전 안 시켜 주시려나? :roll: )
Forums:


C++입니다만 ㅡ,.ㅡ[code:1]#include <cst
C++입니다만 ㅡ,.ㅡ
#include <cstdlib> using namespace std; typedef enum { YC_DO = 1, YC_GAE = 2, YC_GEOL = 3, YC_YUT = 4, YC_MO = 5, } YUT_CASE; inline int generateRandomYutStat(){ //1: 곡면, 0: 평면 return ((rand()%5)>2)?1:0; //0,1,2 vs 3,4 } YUT_CASE generateYut(){ int sum=0; for(int i=0;i<4;i++) sum+=generateRandomYutStat(); return YUT_CASE(sum+1); //대략 캐스팅 -_- }Python :)[code:1]import randompr
Python :)
[quote="ditto"][code:1]import rand
python 저도 배워보고 싶군요... :lol:
=====
http://supaflow.tistory.com
난수 시딩을 안하네요. 예의 코드에서는 필요없는건가요?
난수 시딩을 안하네요. 예의 코드에서는 필요없는건가요?
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
[quote="IsExist"]난수 시딩을 안하네요. 예의 코드에서는 필
추가요 ㅋㅋ
inline void initYut(){ srand(time(0)); }확률
랜덤 초이스에 각각 걸릴 확률을 추가한다면
정도 될려나요. 물론 이건 평면/곡면 비율 계산 안한거지요. 동전으로 윷놀이 할때이지요.
블로그: http://turtleforward.blogspot.com
참고로... 윷놀이의
참고로... 윷놀이의 확률은 고등학교 수학시간에 배운
이항분포를 이용해서 간단하게 풀립니다.
아래와 같은 값을 가지겠네요.
도: 4 * (3/5) * (2/5)^3 = 0.1536
개: 6 * (3/5)^2 * (2/5)^2 = 0.3456
걸: 4 * (3/5)^3 * (2/5) = 0.3456
윷: 1 * (3/5)^4 = 0.1296
모: 1 * (2/5)^4 = 0.0256
이 경우 개와 걸의 확률이 똑같아지네요...
사람들이 느끼는 확률과 대략 들어맞는 게 재밌네요...
윷의 단면은 정확히 반이더라도...
윷의 단면은 정확히 반이더라도...
겉면이 보일 확률보다 잘린 단면이 보일 확률이 더 높습니다.
시중에 파는 윷은 대개 둥글게 깎은 나무 조각의 귀퉁이를 조금 잘라 냈을 뿐이니 더욱 단면이 보일 확률이 높아지죠.
===== ===== ===== ===== =====
knight2000 of SALM.
SALM stood for SALM Ain't a Life Model.
SALM is not the life model, but SALM is just the life.
===== ===== ===== ===== =====
knight2000 of SALM.
SALM stood for SALM Ain't a Life Model.
SALM is not the life model, but SALM is just the life.
Haskell
module Main where import Random import IO generatePae :: Int -> IO [Int] generatePae 0 = return [] generatePae n = do p <- randomIO l <- generatePae (n-1) if p >= ((2::Double)/5) then return (1:l) -- Flat up else return (0:l) -- Curved up throwYut = do pae <- generatePae 4 let n = foldr (+) 0 pae case n of 0 -> putStrLn "You win Mo." 1 -> putStrLn "You win Do." 2 -> putStrLn "You win Gae." 3 -> putStrLn "You win Geol." 4 -> putStrLn "You win Yut." _ -> putStrLn "What the hell!" main = do putStrLn "Press Enter to throw yut.. (Enter q to quit)" c <- getLine if c == "q" then return () else do throwYut main도개걸윷모 맞게 넣었는지 모르겠네요.
수정: 도개걸윷모 의미를 잘못 알았네요. 수정했습니다.
--
foldl (flip (:)) [] "universe"
뒷도란 게 있지 않나요?
module Main where import Random import IO generatePae :: Int -> IO [Int] generatePae 0 = return [] generatePae n = do p <- randomIO l <- generatePae (n-1) if p >= ((2::Double)/5) then return (1:l) -- Flat up else return (0:l) -- Curved up throwYut = do pae <- generatePae 4 let n = foldr (+) 0 pae case n of 0 -> putStrLn "You win Mo. Throw one more time." 1 -> if (head pae) == 1 then putStrLn "You win Back-Do." else putStrLn "You win Do." 2 -> putStrLn "You win Gae." 3 -> putStrLn "You win Geol." 4 -> putStrLn "You win Yut. Throw one more time." _ -> putStrLn "What the hell!" main = do putStrLn "Press Enter to throw yut.. (Enter q to quit)" c <- getLine if c == "q" then return () else do throwYut main빽도가 아니라 뒷도라네요.
--
foldl (flip (:)) [] "universe"
마지막 통계를 보여 주도록
마지막에 통계를 보여 주도록 만들었어요. 그런데 Haskell을 잘 몰라서 허접하게 짠 것 같네요.
module Main where import Random import IO generatePae :: Int -> IO [Int] generatePae 0 = return [] generatePae n = do p <- randomIO l <- generatePae (n-1) if p >= ((2::Double)/5) then return (1:l) -- Flat up else return (0:l) -- Curved up throwYut = do pae <- generatePae 4 let n = foldr (+) 0 pae case n of 0 -> putStrLn "You win Mo. Throw one more time." 1 -> if (head pae) == 1 then putStrLn "You win Back-Do." else putStrLn "You win Do." 2 -> putStrLn "You win Gae." 3 -> putStrLn "You win Geol." 4 -> putStrLn "You win Yut. Throw one more time." _ -> putStrLn "What the hell!" return n playYut count d ga ge yu mo = do putStrLn "Press Enter to throw yut.. (Enter q to quit)" c <- getLine if c == "q" then return [count,d,ga,ge,yu,mo] else do r <- throwYut case r of 0 -> playYut (count+1) d ga ge yu (mo+1) 1 -> playYut (count+1) (d+1) ga ge yu mo 2 -> playYut (count+1) d (ga+1) ge yu mo 3 -> playYut (count+1) d ga (ge+1) yu mo 4 -> playYut (count+1) d ga ge (yu+1) mo _ -> playYut (count+1) d ga ge yu mo main = do [count,d,ga,ge,yu,mo] <- playYut 0 0 0 0 0 0 let [co1,do1,ga1,ge1,yu1,mo1] = map fromIntegral [count,d,ga,ge,yu,mo] if count == 0 then putStrLn "No play" else do putStrLn "------------------------------------------" putStrLn "Statistics" putStrLn "------------------------------------------" putStrLn ("Total : "++(show count)) putStrLn ("Do : "++(show d) ++" "++(show (do1/co1))) putStrLn ("Gae : "++(show ga)++" "++(show (ga1/co1))) putStrLn ("Geol : "++(show ge)++" "++(show (ge1/co1))) putStrLn ("Yut : "++(show yu)++" "++(show (yu1/co1))) putStrLn ("Mo : "++(show mo)++" "++(show (mo1/co1))) putStrLn "------------------------------------------"--
foldl (flip (:)) [] "universe"
평면과 곡면이 뭔지
평면과 곡면이 뭔지 한참 생각했는데 윷가락의 평면과 곡면이었군요. 개인적으로 수학 분야 중 가장 싫어하는 분야가 확률인데...
확률은 너무 어려워용~~
올해에는 꼭 노트북이 생기게 해 주세요.
전 기하학이 가장
전 기하학이 가장 골치 아프던데
논리학도 골치 아프지만
댓글 달기