亂數有些議題特別拉出來再次討論,不熟的話 可看這篇。
1. [low, up]
假定產生 [10,20] 之整數亂數,先考慮以下程式碼
edisonx 發表在 痞客邦 留言(0) 人氣(949)
最近看了二篇 blog 都覺得還蠻喜歡的
[智慧財產權] 著作權 與 專利權 對程式開發者的應用
應該沒人被騙到吧
都在上面留個「推」,還有附迴響,
edisonx 發表在 痞客邦 留言(3) 人氣(141)
C++ 請擅用 vector。
1. 一維陣列
1-1. 配置
edisonx 發表在 痞客邦 留言(0) 人氣(1,258)
1. 基本觀念
線性同餘法基本上只有一個公式,X(n+1) = ( a * X(n) + b ) mod c,
但並非所有 a, b, c 都適用。以 a=5, b=0, c=10 為例,假定 X(0)=3 代入
edisonx 發表在 痞客邦 留言(0) 人氣(5,645)
這問題要解得好,不容易。先考慮一般比較簡單的情況,只考慮真分數,並以 32 / 99 為例 假設 Q=32
32 * 10 = 320 , 320 / 99 = (3) 餘 23
23 * 10 = 230 , 230 / 99 = (2) 餘 32
edisonx 發表在 痞客邦 留言(7) 人氣(9,413)
CL.exe : Visual C/C++ compiler
RC.exe : 資源編譯器
Link.exe : 將 CL.exe 生成之 obj,RC.exe 生成之 .res ,與 lib 等連結成 exe, dll
BSCMAKE.exe : 成生一訊息文件 (.bsc),用於瀏覽程式中之符號 (類別、函式、巨集、資料型態)訊息。
edisonx 發表在 痞客邦 留言(0) 人氣(144)
這問題被問蠻多次,類似的問題與回答在 另一份 blog 裡有提到一點,
裡面提的東西也較多,唯所撰內容過於繁雜,於此盡量「化繁為簡」。
以下之說明基於以下前提假設:
edisonx 發表在 痞客邦 留言(2) 人氣(16,846)
有時突然收了一份程式碼,只是想先看它的執行結果,還不想去開 VC 這麼肥的程式,這裡提供一個簡單方法。
在桌面上建立一個 x.bat (檔名可自己命名),內容如下
@echo off
@echo ************************************************
@echo * 開始 compiler *
@echo ************************************************
@call "%VS100COMNTOOLS%vsvars32.bat"
CL.exe /O2 /Oi /Ot /GT /GL /D "_MBCS" /FD /MT /GS- /arch:SSE2 /GR- /openmp /Fe"%~DP0%~n1.exe" %1
edisonx 發表在 痞客邦 留言(0) 人氣(479)
以下說明之方法,與平方取中法均有相似之處,其重大缺點都一樣,最後容易面臨退化之窘境。
Midproduct Method (中間乘積法)
中間乘積法初始時,亂數種子必須設二個 s1, s2,假設欲生成 0~32767 之亂數 (15 位),乃是將 s1*s2 後之結果 (30 位數),取其中間 15 位數 (32 位元可拆成 9 15 8)。 C 語言大致如下所示
#include <stdio.h>
#include <time.h>
int seed1, seed2;
void MidProduct_srand(int s1, int s2)
{
seed1=s1;
seed2=s2;
}
int MidProduct_rand()
{
int ret = ((seed1 * seed2) & 0x007fffff) >> 8;
seed1 = seed2;
seed2 = ret;
return ret;
}
int main()
{
int i=0;
MidProduct_srand((int)time(NULL), (int)time(NULL));
for(i=0; i!=20; ++i) printf("%d ", MidProduct_rand());
return 0;
}
edisonx 發表在 痞客邦 留言(0) 人氣(142)
K algorithm ( "Super-random" number generator)
這是由 Kunth 於 The Art Of Programming 裡提出說明,當時 Kunth 試著以此演算法建立較好之 PRNG,也強調讀者不必特別研究它,故這部份沒太大興趣者可跳過,流程大致如下,其中 ** 代表次方,如 3**5 代表 3 的 5 次方。(以下特別注意 K1, K2)
INIT: 給一 10 位數 X ,進行以下步驟
K1. 選擇迭代次數: Y:= X/(10 ** 9),執行 K2~K13 ,Y+1次。
K2. 選擇隨機步驟: Z:= Y/(10 ** 8) mod 10,步驟轉向 K(3+Z)
K3. 確保 X >= 5* 10**9: 若 X < 5000000000 , X := X + 5000000000
K4. 平方取中法: X := (X*X / 10 ** 5) mod 10
K5. 進行乘法: X:= 1001001001X
K6. 假(偽)補數: 若 X < 10 ** 8 , X:= X+9814055677;否則 X:=10 ** 10 - X
K7. 互換二半: X 高5位與 X 低5位 (十進制) 交換,即 X:= (X mod 10 ** 5) + (X / 10 **5)
K8. 進行乘法: 同 K5
K9. 減小數字:將 X 之十進制表示之每個非 0 數字減 1
K10. 9999修改:若 X<100000,X:=X*X + 9999;否則 X:=X-9999
K11. 正規化:此時 X 不能為零,若 X < 10 ** 9 ,X:=10X,重覆此步驟
K12. 修正之平方取中法: X:= ( X*(X-1) / 10 ** 5 ) mod ( 10 ** 10),即中間十位數取代 X
K13. 重複 ? :若 Y>0,Y:=Y-1,回到步驟 K2;若 Y=0,其 X 即為隨機值。
edisonx 發表在 痞客邦 留言(0) 人氣(184)