설날 D-3! 윷놀이용 난수 발생기

cppig1995의 이미지

#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: 
IDNed의 이미지

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); //대략 캐스팅 -_-
}
7339989b62a014c4ce6e31b3540bc7b5f06455024f22753f6235c935e8e5의 이미지

Python :)

import random
print random.choice(u"도개걸윷모")
supaflow의 이미지

ditto wrote:

import random
print random.choice(u"도개걸윷모")

python 저도 배워보고 싶군요... :lol:

IsExist의 이미지

난수 시딩을 안하네요. 예의 코드에서는 필요없는건가요?

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

IDNed의 이미지

IsExist wrote:
난수 시딩을 안하네요. 예의 코드에서는 필요없는건가요?

추가요 ㅋㅋ

inline void initYut(){
   srand(time(0));
}
only2sea의 이미지

랜덤 초이스에 각각 걸릴 확률을 추가한다면

import random
print random.choice(u"도도도도개개개개개개걸걸걸걸윷모")

정도 될려나요. 물론 이건 평면/곡면 비율 계산 안한거지요. 동전으로 윷놀이 할때이지요.

ditto wrote:
Python :)

import random
print random.choice(u"도개걸윷모")
익명사용자의 이미지

참고로... 윷놀이의 확률은 고등학교 수학시간에 배운
이항분포를 이용해서 간단하게 풀립니다.
아래와 같은 값을 가지겠네요.

도: 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의 이미지

윷의 단면은 정확히 반이더라도...
겉면이 보일 확률보다 잘린 단면이 보일 확률이 더 높습니다.
시중에 파는 윷은 대개 둥글게 깎은 나무 조각의 귀퉁이를 조금 잘라 냈을 뿐이니 더욱 단면이 보일 확률이 높아지죠.

===== ===== ===== ===== =====
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.

esrevinu의 이미지

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"

esrevinu의 이미지

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"
esrevinu의 이미지

마지막에 통계를 보여 주도록 만들었어요. 그런데 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"
freesky의 이미지

평면과 곡면이 뭔지 한참 생각했는데 윷가락의 평면과 곡면이었군요. 개인적으로 수학 분야 중 가장 싫어하는 분야가 확률인데...

확률은 너무 어려워용~~

올해에는 꼭 노트북이 생기게 해 주세요.

익명사용자의 이미지

전 기하학이 가장 골치 아프던데
논리학도 골치 아프지만

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.