看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《chrisjon (隨機數能吃嗎?)》之銘言: : ===========程式內容================== : #include <stdio.h> : void lcga(void) : { : static int Lcg_seed = 12345; : int lcg_a,lcg_p; : lcg_p = 2147483647; : lcg_a = 16807; : lcg_seed = (lcg_a*lcg_seed) % lcg_p; ^ ^ 大小寫不符合 這樣應該無法編譯成功 : printf("%d\n", Lcg_seed); : } : int main(void) : { : int i; : for(i=0; i<5;i++) : lcga(); : printf("%d\n", Lcg_seed); 寫程式不要這樣縮排,很容易以為你的 printf 也是迴圈的一部份 一般的良好寫法是這樣: for(i = 0; i < 5; i++) lcga(); printf("%d\n", Lcg_seed); : return 0; : } [deleted] : 我仿書上把lcg_seed在全區宣告,但是不知道為什麼 : 呼叫lcga,在lcga列印lcg_seed是 0;在main列印lcg_seed是12345不會變 : 所以試著用 static ,結果可以,但是變得無法在main print....(紅色那行) 應該是其它地方寫錯了,請附上完整程式碼 : 另外,我的程式中 : lcg_seed = (lcg_a*lcg_seed) % lcg_p; : 照道理來講,求出來的餘數應該永遠是正的 : 怎麼會出現負的答案呢...~.~?? : 我用Maple程式去跑答案,只有第一個答案是正確的,之後沒有一個正確 : 程式哪裡有問題呢?? 因為 int 一般來說大小為 32bit 儲存範圍是 -2147483648 ~ 2147483647 你的計算已經超過了它的範圍,當然會得到錯誤的結果 C99 的標準有提供 64bit 的整數型別 int64_t 如果你的 compiler 有支援,這是最簡單的解決方法 : ======================================== : 另外 : int main(void) : { : unif01_Gen *gen; : gen = ulcg_CreateLcg (2147483647, 397204094, 0, 12345); : retuen 0 : } : 我執行過相同的 ulcg_CreateLcg函數(包含後方的參數) : 它能產生不同的數字 : 我該如何 寫出像這樣的函數呢? 它可能用了 64bit 整數 或是自己去處理大數運算 : 是否直接用.txt寫好,存成.c 就可以用#include "lcga.c"呼叫了呢? : 感恩 不行,這不是正確用法。 正確的方法是把函式的宣告寫在 .h 內,函式的實作寫在 .c 內, 然後讓你的主程式去連結函式的實作 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.217.34.43
chrisjon:lcg_seed 原始是寫 Lcg_seed,我的全程式就是那樣^^" 05/03 15:09
chrisjon:喔!!會錯意...我去生出程式碼,謝謝建議 05/03 15:20
chrisjon:我不知道有沒有支援...^^" 那要怎麼宣告呢? 05/03 15:33
chrisjon:我剛去試著改宣告成double lcg_seed,結果 %無法計算.. 05/03 15:34
chrisjon:把lcg_a和lcg_p一起改成double,一樣也無法計算%...~.~ 05/03 15:35
chrisjon:錯誤都一樣(invalid operand to binary %) 05/03 15:39
chrisjon:剛把lcg_seed丟到全域,又可以跑了...怪怪..只是一樣溢位 05/03 15:40
weiyucsie:我只知道c99有long long 可是有int64_t嗎? 05/03 16:14
sunneo:%的問題再很久以前的文章提過了 要用fmod 05/03 16:18
sunneo:浮點操作跟整數操作有差 05/03 16:19
sunneo:如果你這麼堅持要% 那乾脆(*(long long*)&變數1)%(變數2) 05/03 16:20
chrisjon:之前原本是以為要產生浮點數,後來發現好像不用 05/03 16:20
chrisjon:所以就把浮點數部份的程式刪除了,現在只是要整數就行了 05/03 16:21
chrisjon:用%是要求餘數,不是嗎? ^^" 05/03 16:23
chrisjon:int64_t 有用,剛剛去試了,執行成功,沒有溢位問題^^ 05/03 16:24
sunneo:%只有定義整數的餘數操作 沒有定義在浮點數上 05/03 16:24
chrisjon:(至少我剛的16807*lcg_seed mod (2^31-1)跑5次沒溢位) 05/03 16:25
chrisjon:嗯嗯!!sun大,我已經把浮點數的部份刪除了,所以改回用% 05/03 16:26
adrianshum:良好的寫法是單一行也加 { .. } 05/04 12:00