[問題] 哪裡出問題了..=.=a?

看板C_and_CPP作者 (隨機數能吃嗎?)時間15年前 (2009/04/28 22:51), 編輯推噓4(4025)
留言29則, 6人參與, 最新討論串1/1
#include <stdio.h> #include <math.h> int main() { float f; int lcg_p,lcg_a; int Lcg_seed; lcg_p = 2147483647; lcg_a = 16807; scanf("%d", &Lcg_seed); printf("%d\n", Lcg_seed); Lcg_seed = Lcg_seed*lcg_a % lcg_p; printf("%d\n", Lcg_seed); f = Lcg_seed / lcg_p; printf("%f\n", f); return Lcg_seed; } ================================== 簡單的數學式表示就是 X[i] = a*X[i-1] mod p mod 為取餘數 ================================== 我重新修改過 compile成功 但是 f完全沒有計算,print出來是0.00000 另外,return是整個程式計算完之後,要回傳的值嘛? 所以我return後,應該會回傳Lcg_seed的值不是嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.195.128.31

04/28 22:54, , 1F
取餘數限定用在整數。一定要將取餘數的數改成int型態
04/28 22:54, 1F

04/28 22:56, , 2F
浮點數的餘數要用 math.h的 fmod
04/28 22:56, 2F

04/28 22:56, , 3F
另外main的回傳值必須是整數
04/28 22:56, 3F

04/28 23:17, , 4F
可是,如果取int而不用double的話,p算不會爆量嗎?
04/28 23:17, 4F

04/28 23:18, , 5F
例如int上限100,而a*b % 3 = 101 % 3 = 2 不會爆掉嗎?
04/28 23:18, 5F

04/28 23:24, , 6F
(a * b) mod c = (a mod c)*(b mod c) mod c
04/28 23:24, 6F

04/28 23:36, , 7F
a<c,b<c,但有可能a*b>c,而c是2^31 - 1,謝謝
04/28 23:36, 7F
※ 編輯: chrisjon 來自: 123.195.128.31 (04/29 00:07)

04/29 02:07, , 8F
f = Lcg_seed / (float) lcg_p; 新手級問題
04/29 02:07, 8F
謝謝,只學過其他語言,臨時因用到的套裝軟體需要而來了解c語言 在圖書館借幾書要在幾個月內就要弄好,真的有點趕,好在有學過其他語言 能比較快一點進入狀況。 真不好意思問這些新手問題,但周圍又沒其他人會c語言,所以只能 麻煩板上各位先進幫我這臨陣磨槍的新手一個忙了^^" 感恩 ※ 編輯: chrisjon 來自: 123.195.128.31 (04/29 04:41)

04/29 09:53, , 9F
整數/整數會用整數除法算,所以你至少要把其中一者強制
04/29 09:53, 9F

04/29 09:54, , 10F
轉為浮點,他才會用浮點除法計算
04/29 09:54, 10F

04/29 22:15, , 11F
唔...這就麻煩了..Lcg_seed和lcg_p前部份要設成int
04/29 22:15, 11F

04/29 22:15, , 12F
這樣才能計算%,現在又要設成float...囧"
04/29 22:15, 12F

04/30 00:32, , 13F
推過了 fmod ...
04/30 00:32, 13F

04/30 00:32, , 14F
會用內建函式就省了麻煩了不是 ?
04/30 00:32, 14F

04/30 00:33, , 15F
還是你壓根不想使用內建函式?
04/30 00:33, 15F

04/30 00:38, , 16F
也搞不好是作業, 老師規定不準用內建函數....XD
04/30 00:38, 16F

04/30 00:38, , 17F
遙想以前計組, 老師作業是要我們自己寫把ASCII 123.456
04/30 00:38, 17F

04/30 00:39, , 18F
這樣的user input, 轉換並寫入float f去, IEEE754啊Orz
04/30 00:39, 18F

04/30 01:11, , 19F
不過那可真令人疑惑了呢 因為他連math.h都include了...
04/30 01:11, 19F

04/30 01:23, , 20F
我看他好像沒真的call到math.h的lib就是了, 不過小弟也
04/30 01:23, 20F

04/30 01:24, , 21F
只是亂猜啦; 真要的話還是得請原po自己說明清楚了:)
04/30 01:24, 21F

04/30 02:18, , 22F
fmod那個是我漏看了...^^"拍洗
04/30 02:18, 22F
如果要說是作業,其實也不為過...因為是論文...~.~ http://www.iro.umontreal.ca/~simardr/testu01/tu01.html pdf載點 http://www.iro.umontreal.ca/~simardr/testu01/guideshorttestu01.pdf 不過這是guide short testu01 我是看 guide long testu01 我現在在看第二章的部份 苦於英文及組合能力太差....單字查完看得懂,全段意思組不起來...囧" 只知道裡面有提到 "非常簡單"、"使用外來的產生器做檢定很簡單" .....= =" 然後大概也看得懂部份程式,但是就是...不會使用....~.~ 我現在先試著把我已經用Maple語言寫好的程式碼轉成C語言來跑 然後再運用cygwin去測轉好的程式有沒有問題 說明書嘛...再慢慢看...總會看得通的.... ※ 編輯: chrisjon 來自: 123.195.128.31 (04/30 02:31)

04/30 02:38, , 23F
但是不管怎麼說 X[i] = a*X[i-1] mod p
04/30 02:38, 23F

04/30 02:39, , 24F
其中X[ i ]如果是浮點數 那麼這個式子應該是
04/30 02:39, 24F

04/30 02:39, , 25F
X[i] = a * fmod( X[i-1], p )
04/30 02:39, 25F

04/30 02:39, , 26F
其中fmod就是浮點數該使用的餘數函式
04/30 02:39, 26F

04/30 02:41, , 27F
然後 f = Lcg_seed / lcg_p 這個式子你會永遠得到0
04/30 02:41, 27F

04/30 02:57, , 28F
找到了fmod的說明,謝謝 用法了解中
04/30 02:57, 28F

04/30 03:13, , 29F
原來 /(float)lcg_p 也是一種用法= ="
04/30 03:13, 29F
文章代碼(AID): #19znW1M8 (C_and_CPP)