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

ren1244 發表於 2017-5-13 05:14 PM

%6是說取6的餘數,所以:

x%6x個數
0 0, 6,12,18,24,30,36,42,48,54,6011
1 1, 7,13,19,25,31,37,43,49,55,6111
2 2, 8,14,20,26,32,38,44,50,56,6211
3 3, 9,15,21,27,33,39,45,51,5710
4 4,10,16,22,28,34,40,46,52,5810
5 5,11,17,23,29,35,41,47,53,5910

#define eyny_print printf
代表下面程式碼遇到 eyny_print 會用 printf 取代
寫這行只是因為伊莉遇到 printf加括號 會視為敏感字
所以透過這方法貼程式碼而已
你只要把下面的 eyny_print 都看成 printf 就可以了
同理:
#define DICETIMES 1000000
只要把後面的 DICETIMES 都看成 1000000 就可以了
用這技巧可以很方便的修改想要跑的迴圈數
相關章節:巨集(macro)

至於 srand 方面
你可以試看看不加 srand 下,你每次跑出來的結果是不是都一樣?
這是因為絕大多數程式語言的亂數都是偽隨機
也就是利用某種數學式計算出來的結果
而 srand 很像是指定起始點
srand(起始點位置)
而 time(NULL) 則是取得現在的時間
srand(time(NULL)) 就是以現在的時間做為起始位置
這樣更有隨機的感覺
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

炽天使 發表於 2017-6-3 04:31 PM

鄭偉博 發表於 2017-5-12 10:53 PM static/image/common/back.gif
謝謝!!!這樣變得好簡短><

srand(time(NULL));


srand(time(NULL));
這個是一個亂排的公能如果你不要它重復你要自己加ifelse

炽天使 發表於 2017-6-5 08:05 PM

熾天使 發表於 2017-6-3 04:31 PM static/image/common/back.gif
srand(time(NULL));
這個是一個亂排的公能如果你不要它重復你要自己加ifelse

ifelse要看你的條件,如過你不要它重復就用forloop和ifelse

炽天使 發表於 2017-6-5 08:19 PM

熾天使 發表於 2017-6-3 04:31 PM static/image/common/back.gif
srand(time(NULL));
這個是一個亂排的公能如果你不要它重復你要自己加ifelse

你的答案應該有重復的,是嗎?

chevylin0802 發表於 2017-6-5 09:42 PM

本帖最後由 chevylin0802 於 2017-6-5 10:34 PM 編輯

感覺有點怪
因為如果題目改成1,3,5的機率是2,4,6的1.1倍時
就不靈了
或者出得再難一點
1到6出現的機率
分別是1.3,1.5,1.2,1.1,1.0,0.9
那豈不是就掛了。

其實電子賭場經常做這種事
他們不會給你擲數百萬次的統計結果才出現那種機率
往往只有一百次的統計就要逼近預期的結果
甚至還可以遠端遙控機率
所以一定有更好的解法
...<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>

weirdococo 發表於 2017-6-6 09:38 AM

本帖最後由 weirdococo 於 2017-6-6 09:40 AM 編輯

chevylin0802 發表於 2017-6-5 09:42 PM static/image/common/back.gif
感覺有點怪
因為如果題目改成1,3,5的機率是2,4,6的1.1倍時
就不靈了

我的想法(演算)是,先造出一個1..N的成對資料(一個hash或是兩個array),
在由那個成對資料容合成為一個array(像是 1 2 3  =>...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2017-6-6 11:53 AM

本帖最後由 chevylin0802 於 2017-6-6 12:04 PM 編輯

weirdococo 發表於 2017-6-6 09:38 AM static/image/common/back.gif
我的想法(演算)是,先造出一個1..N的成對資料(一個hash或是兩個array),
在由那個成對資料容合成為一個 ...
我想請你做一個實驗
連續兩次取出亂數之後
只取亂數的000~999之間的數字
兩個數字相減取絕對值
把它當成是最後結果
如此重覆跑100及1000次之後
計算看看百位數的0~9之間的個數是不是遠比單純只取亂數來得平均一些
把跑100次跟1000次所得到的百位數0~9次數統計的結果秀圖出來看看
這是為了改善只有單純使用srand(time(NULL))/rand()時必需取樣大量次數才能得到接近期望結果的方法之一

因為坦白講
機率學講得很清楚
每一次擲骰子1~6的每一個面為正面的機率
不會隨著擲的次數而改變
也就是前一次的結果不會影響到後一次的結果
所以大數量統計只是一種理論值
它無法帶給你每擲六次都會從1~6分別各出現一次的結果
而這就是我在講怪怪的問題點


...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

weirdococo 發表於 2017-6-6 06:03 PM

本帖最後由 weirdococo 於 2017-6-6 06:55 PM 編輯

chevylin0802 發表於 2017-6-6 11:53 AM static/image/common/back.gif
我想請你做一個實驗
連續兩次取出亂數之後
只取亂數的000~999之間的數字

先上結果
原始資料:
標準化:

因為我不太會寫C,所以其實把C的資料餵給一些script來處理畫圖。
還有因為1000的資料太少,我改成
亂數的000~999之間的數字
每兩比數字相減取abs(像是 1 2 3 4 就變成  1  1) {ps 我不知道為什麼要做這步驟}
秀出這筆資料的前1000筆。

上code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main( ) {
    srand(time(NULL));
    while(1) {
        print_f("%d\n", rand() );
    }
}

script side
use v6;
use SVG;
use SVG::Plot;

my $proc = run 'main.exe', :out;
my @randList = lazy (loop { $proc.out.get });
my @filter =  @randList.grep({  $_ < 1000 && $_ > 0  });
my @target = lazy gather for @filter -> $a , $b  { take ($a - $b).abs  };

sub stddev($x) {
    sqrt
        (. += $x**2) / ++. -
        ((. += $x) / .)**2
    given state @;
}

#my @draw = (for @target[^1000] { stddev $_  }) ;
my @draw = @target[^1000];

my $tmp = open 'rand.svg', :w ;

$tmp.say(
  SVG.serialize: SVG::Plot.new(
      :title( "average = {  @draw.sum  / 1000 }" ),
      :width( 1200 ),
      :height( 600 ),
      :background( '#fffff0' ),
      :colors( 'rgba(0,255,0,0.5)', 'rgba(0,0,255,0.5)' ),
      :label-font-size( 10 ),
      :labels( 1.. 1000 ),
      :values( $@draw ),
  ).plot(:lines)
) ;

$tmp.close ;







...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

chevylin0802 發表於 2017-6-6 06:56 PM

本帖最後由 chevylin0802 於 2017-6-6 06:59 PM 編輯

weirdococo 發表於 2017-6-6 06:03 PM
先上結果
原始資料:
標準化:


把你手上的結果換成只取百位數
應該就會得到0到9的數字
我請你做的實驗是
最少需要多少次的次數
才能得到0到9的出現次數結果趨近於一致
你會發現,隨機亂數的方式,需要極大量的次數才能出現趨近一致的理論值
但是我講的方式
卻可以只用100次或1000次就能實現...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

a333221 發表於 2017-6-9 11:19 PM

有沒有達到作弊效果,就驗證而言,要做夠多次的擲骰子,

只要擲的次數越多,得到的結果就會越接近真實的機率值,

驗證的過程是擲的次數越多,得到的結果被視為越可靠,

而非先假定結果是什麼,然後試著在擲一定的次數後要看到想看的結果

除非像民調那樣,用抽樣來估整體,但民調跟骰子好像沒什麼關係 <br><br><br><br><br><div></div>

ren1244 發表於 2017-6-10 11:30 AM

本帖最後由 ren1244 於 2017-6-10 11:31 AM 編輯

如果希望更複雜的比例,這邊提供一個算法


[*]先計算比例的總和
[*]將個別的比例除以總和,成為丟到該點數的機率
[*]計算累進機率
[*]產生0~1之間的亂數,看落在哪個區間就得出幾點

範例:


點數123456
比例1.31.11.41.11.51.9
機率0.1570.1330.1690.1330.1810.229
累進機率0.1570.2890.4580.590.7711



參考程式碼:http://codepad.org/iSj00cEC...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

weirdococo 發表於 2017-6-11 11:22 AM

weirdococo 發表於 2017-6-6 06:03 PM static/image/common/back.gif
先上結果
原始資料:
標準化:


我也覺得怪怪的,而且那亂數感覺起來有沒有落在500的感覺,整體偏低的樣子,還有,感覺起來我自己寫的標準化有些問題(或者那亂數有問題),找機會用R跑跑看(雖然還沒有學過)。

weirdococo 發表於 2017-6-11 11:27 AM

ren1244 發表於 2017-6-10 11:30 AM static/image/common/back.gif
如果希望更複雜的比例,這邊提供一個算法




好,找機會測試看看,順便一提,我還會想想如何把這個想法(演算)生成不重複了亂數表,那樣說不定會很有用(之前在想說做出一個hash要從頭到尾查詢,如果key都在最後一個就會沒有效率,但是如果我把它改為不重複亂數key查詢,說不定有效率一些)。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

volk1979 發表於 2019-3-8 09:32 PM

chevylin0802 發表於 2017-6-6 06:56 PM static/image/common/back.gif
把你手上的結果換成只取百位數
應該就會得到0到9的數字
我請你做的實驗是


...

...

以地球引力方面來看,會不會使用真實骰子來擲的話反而是4/5/6出現的現象來的多

1/2/3因骰子製作時骰子被挖除的材質較少
頁: 1 [2]