查看完整版本: 作弊骰子:出現 1、2、3 的機率是 4、5、6 的 1.1 倍
頁: [1] 2

鄭偉博 發表於 2017-5-5 04:08 PM

作弊骰子:出現 1、2、3 的機率是 4、5、6 的 1.1 倍

本帖最後由 鄭偉博 於 2017-5-5 04:08 PM 編輯



題目要求要將產生的點數印出來且要證明擲出123的機率是擲出456機率的1.1倍

我不知道如何改變骰子擲點數的機率....我思考的方向也很混亂....


<div></div>

kauhia3440 發表於 2017-5-5 09:59 PM

假如擲63次骰子
出現11個1點
11個2點
11個3點
10個4點
10個5點
10個6點
這樣就符合"擲出123的機率是擲出456機率的1.1倍"

用if...else if ...來判斷
rand()%63 < 11:print(1)
rand()%63 < 22:print(2)
rand()%63 < 33:print(3)
rand()%63 < 43:print(4)
rand()%63 < 53:print(5)
rand()%63 < 63:print(6)

鄭偉博 發表於 2017-5-6 01:18 AM

本帖最後由 鄭偉博 於 2017-5-7 03:29 PM 編輯

kauhia3440 發表於 2017-5-5 09:59 PM static/image/common/back.gif
假如擲63次骰子
出現11個1點
11個2點

那可以假設擲出21次嗎1  5次
2  5次
3  1次
4  3次
5  3次
6  4次

kauhia3440 發表於 2017-5-10 01:07 PM

鄭偉博 發表於 2017-5-6 01:18 AM static/image/common/back.gif
那可以假設擲出21次嗎1  5次
2  5次
3  1次


可是這樣跑出3點的機率會很低

ash1326 發表於 2017-5-11 02:18 AM

本帖最後由 ash1326 於 2017-5-11 02:56 AM 編輯

你沒有使用srand,這樣只有亂數表,沒有影響因子

也就是說不管怎麼跑,結局永遠不變

還有code別貼圖檔...這樣沒人會想幫你run<br><br><br><br><br><div></div>

鄭偉博 發表於 2017-5-11 09:49 AM

ash1326 發表於 2017-5-11 02:18 AM static/image/common/back.gif
你沒有使用srand,這樣只有亂數表,沒有影響因子

也就是說不管怎麼跑,結局永遠不變


我們老師只教我們用RAND沒有教我們SRAND...
不好意思我是第一次發文看別人也是用圖檔的...謝謝指教

ash1326 發表於 2017-5-11 12:47 PM

鄭偉博 發表於 2017-5-11 09:49 AM static/image/common/back.gif
我們老師只教我們用RAND沒有教我們SRAND...
不好意思我是第一次發文看別人也是用圖檔的...謝謝指教 ...

如果你是想要絕對機率1.1的話

3樓的寫法可以更改成先抽出21個不重複亂數(1~21)

然後數字<=11的,就使用 rand()%3+1

抽到數字 12~21,就使用 rand()%3+4

這樣就保證擲出123的機率會等於456的1.1倍...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

鄭偉博 發表於 2017-5-11 01:21 PM

ash1326 發表於 2017-5-11 12:47 PM static/image/common/back.gif
如果你是想要絕對機率1.1的話

3樓的寫法可以更改成先抽出21個不重複亂數(1~21)


謝謝ash1326,可是我想再請問一下為什麼要用3呢?

weirdococo 發表於 2017-5-12 10:43 AM

use v6;

my %construct = 1..6 Z=> 11/63, 11/63, 11/63, 10/63, 10/63, 10/63 ;
my @gonnaPick is default(0);
for %construct -> $pair {
        @gonnaPick.push( (loop { $pair.key })[ ^ $pair.value.numerator] );
}
@gonnaPick = ( @gonnaPick ).List.flat();

my %count;
for ^10000 {
        my $buffer = @gonnaPick.pick(1);
        " $_ time, we pick $buffer".say;
        %count{ $buffer }++;
}

say %count;
say qq:to/END/;
1 = { %count{1} } times, rate is {  %count{1} / [+] %count.values }
2 = { %count{2} } times, rate is {  %count{2} / [+] %count.values }
3 = { %count{3} } times, rate is {  %count{3} / [+] %count.values }
4 = { %count{4} } times, rate is {  %count{4} / [+] %count.values }
5 = { %count{5} } times, rate is {  %count{5} / [+] %count.values }
6 = { %count{6} } times, rate is {  %count{6} / [+] %count.values }
END

補充內容 (2017-5-12 10:57 AM):
這是用perl寫的版本,C語言的貼不太上來,太多敏感字!!反正改寫也是不錯的練習(為自己找藉口)!

補充內容 (2017-5-12 11:19 AM):
反正大家說,C語言包括了所有概念,會C語言其他語言都看得懂(藉口其二)!...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

鄭偉博 發表於 2017-5-12 03:14 PM

weirdococo 發表於 2017-5-12 10:43 AM static/image/common/back.gif
use v6;

my %construct = 1..6 Z=> 11/63, 11/63, 11/63, 10/63, 10/63, 10/63 ;


我只是個大一上程設不到一個學期的蔡菜鳥阿Q<br><br><br><br><br><div></div>

weirdococo 發表於 2017-5-12 04:30 PM

鄭偉博 發表於 2017-5-12 03:14 PM static/image/common/back.gif
我只是個大一上程設不到一個學期的蔡菜鳥阿Q

#那我加上解說
use v6;

#產生一個hash,有六個key分別是一 到 六,內容分別是抽到他的機率。
my %construct = 1..6 Z=> 11/63, 11/63, 11/63, 10/63, 10/63, 10/63 ;
#用那一個hash來初始化一個array,看齊來大概是 11 個 1 、 11 個 2 ..... 10 個 6
my @gonnaPick is default(0);
for %construct ->...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ren1244 發表於 2017-5-12 05:27 PM

關於貼程式碼的問題,可以參考版規喔:
http://www17.eyny.com/thread-8627739-1-1.html (2F有提供兩個允許貼程式碼的外部網址)

對於發問的文章,我覺得會想讓人處理的優先次序是:
文字檔程式碼 > 圖片程式碼 > 都沒給code
(當然也會考慮問題內容跟發問者是否有提供想法)

下面基本上是照2F想法寫的,不過不用 if...else ,直接用計算的方式得出幾點。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define DICETIMES 1000000
#define eyny_print printf

int main()
{
        int i,r,count={0};
        srand(time(NULL));
        for(i=0;i<DICETIMES;++i)
        {
                while((r=rand())>=RAND_MAX/63*63);
                r%=63;
                ++count;
        }
        for(i=0;i<6;++i)
                eyny_print("%d: %d times...%.2lf%%\n",i+1,count,(double)count/DICETIMES*100.0);
        return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

鄭偉博 發表於 2017-5-12 08:04 PM

這是我和朋友想出來的
因為包括敏感內容所以用網頁貼上
http://codepad.org/0yqpSZwV
謝謝各位幫忙
因為會的東西真的很少所以有些程式碼我看不懂....

weirdococo 發表於 2017-5-12 09:41 PM

把你寫的用perl寫了一遍,你會發覺長的一樣,有沒有這樣覺得!my %count;
my @face = ( loop { 1 + [%] (rand * 100).round(1) , 63 , 6 } )[ ^100000 ];
%count{ $_ }++ for @face;
say %count;
"1.2.3的總數除以4.5.6的總數 = { ([+] %count{1..3} ) / ([+] %count{4..6}) }".say;run code online
還有你寫的版本比我的好,我的是硬做出了的!

鄭偉博 發表於 2017-5-12 10:53 PM

鄭偉博 發表於 2017-5-12 08:04 PM static/image/common/back.gif
這是我和朋友想出來的
因為包括敏感內容所以用網頁貼上
http://codepad.org/0yqpSZwV


謝謝!!!這樣變得好簡短><

srand(time(NULL));
這行我也不是很懂,老師只教我們用RAND而且也只是用來做這題所以就只是叫我們這題要用這個打而已,
我同學有跟我解釋但我不是很懂,因為亂數%63後就只剩下0~62,再6個6個一數就會剩下3個1.2.3
我覺得這樣想很怪...不太懂Q...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>
頁: [1] 2