C_and_CPP 板


LINE

※ 引述《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
1F:推 chrisjon:lcg_seed 原始是寫 Lcg_seed,我的全程式就是那樣^^" 05/03 15:09
2F:→ chrisjon:喔!!會錯意...我去生出程式碼,謝謝建議 05/03 15:20
3F:→ chrisjon:我不知道有沒有支援...^^" 那要怎麼宣告呢? 05/03 15:33
4F:→ chrisjon:我剛去試著改宣告成double lcg_seed,結果 %無法計算.. 05/03 15:34
5F:→ chrisjon:把lcg_a和lcg_p一起改成double,一樣也無法計算%...~.~ 05/03 15:35
6F:→ chrisjon:錯誤都一樣(invalid operand to binary %) 05/03 15:39
7F:→ chrisjon:剛把lcg_seed丟到全域,又可以跑了...怪怪..只是一樣溢位 05/03 15:40
8F:→ weiyucsie:我只知道c99有long long 可是有int64_t嗎? 05/03 16:14
9F:→ sunneo:%的問題再很久以前的文章提過了 要用fmod 05/03 16:18
10F:→ sunneo:浮點操作跟整數操作有差 05/03 16:19
11F:→ sunneo:如果你這麼堅持要% 那乾脆(*(long long*)&變數1)%(變數2) 05/03 16:20
12F:→ chrisjon:之前原本是以為要產生浮點數,後來發現好像不用 05/03 16:20
13F:→ chrisjon:所以就把浮點數部份的程式刪除了,現在只是要整數就行了 05/03 16:21
14F:→ chrisjon:用%是要求餘數,不是嗎? ^^" 05/03 16:23
15F:→ chrisjon:int64_t 有用,剛剛去試了,執行成功,沒有溢位問題^^ 05/03 16:24
16F:→ sunneo:%只有定義整數的餘數操作 沒有定義在浮點數上 05/03 16:24
17F:→ chrisjon:(至少我剛的16807*lcg_seed mod (2^31-1)跑5次沒溢位) 05/03 16:25
18F:→ chrisjon:嗯嗯!!sun大,我已經把浮點數的部份刪除了,所以改回用% 05/03 16:26
19F:→ adrianshum:良好的寫法是單一行也加 { .. } 05/04 12:00







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS站內搜尋

TOP