Re: [問題] 想請問flash高手...這程式哪裡出問題?

看板Flash作者 (喵)時間19年前 (2006/11/19 13:07), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/8 (看更多)
※ 引述《aquarianboy (一路好走..)》之銘言: : gcd公式本身看起來並沒什麼問題 : 我猜,問題是出在random上面 : 你用的方式:random(31) : 這是比較舊式的寫法,查了一下F1的說明: : In Flash Player 4, the methods and properties of the Math class : are emulated using approximations and might not be as accurate : as the non-emulated math functions that Flash Player 5 supports. : 你可以參考一下F1裡的那段範例: : function randRange(min:Number, max:Number):Number { : var randomNum:Number; ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 這個地方用var_name:Number的用意是什麼啊?? 我查了f1沒看到耶.... 而且我覺得flash宣告變數的地方和php比較不一樣的是 php好像可以設定我要幾位整數幾位小數的變數 可是flash我都沒看過有類似這樣的宣告法.... (如果有的話我的程式就不用除以十再乘以十了....) : randomNum = Math.floor(Math.random() * (max - min + 1)) + min; : return randomNum; : } : trace(randRange(1, 31)); : 供你參考 :) 感謝您 我也曾經懷疑過random的準確性 而將程式中random改成Math.floor((Math.random())*31)+1, 其結果相同 會出現同樣的問題 而另外設定您所提供的函數 修改結果如下 *******除此之外還有gcd和randRange的函數******* _root.onEnterFrame=function () { t1=randRange(1,31); t2=randRange(1,31); s1=t1/gcd(t1,t2); s2=t2/gcd(t1,t2); trace("1.原始最簡單整數比前項="+s1); trace("2.原始最簡單整數比後項="+s2); multi=randRange(1,31); q1=s1*multi; q2=s2*multi; q1=q1/10; trace("3.原始小數題目前項="+q1); q2=q2/100; trace("4.原始小數題目後項="+q2); s1=q1*100; trace("5.新的最簡單整數比前項"+s1); s2=q2*100; trace("6.新的最簡單整數比後項"+s2); trace("7.用新的最簡單整數比求出最大公因數="+gcd(s1,s2)); ss1=s1/gcd(s1,s2); trace("8.本題最後的答案前項="+ss1); ss2=s2/gcd(s1,s2); trace("9.本題最後的答案後項="+ss2); trace(""); } ************** 也是會有相同的問題,我將有問題的結果貼進來 1.原始最簡單整數比前項=4 2.原始最簡單整數比後項=3 3.原始小數題目前項=4.4 4.原始小數題目後項=0.33 5.新的最簡單整數比前項440 6.新的最簡單整數比後項33 7.用新的最簡單整數比求出最大公因數=1.70530256582424e-13 8.本題最後的答案前項=2.58018728651435e+15 9.本題最後的答案後項=193514046488576 我個人覺得比較有可能的問題是在先除以10或100之後再乘以10或100 因為如果沒有除以10或100這段的話(乘以10或100留著都無所謂) 就不會出現這樣的問題 但是只要加上這個部份就會出現問題..... 而且我比較有疑問的是 明明trace出來是整數 為什麼在gcd裡面好像就會變成小數呢? 而會這樣想是因為gcd函數如果變成 function gcd(int1,int2) { a=Math.floor(Math.max(int1,int2)); b=Math.floor(Math.min(int1,int2)); while(a%b!=0){ c=a-Math.floor(a/b)*b; a=b; b=c; } return b; } 那麼就比較不會出現1.70530256582424e-13這樣的數字,可是有下列的奇怪結果 1.原始最簡單整數比前項=9 2.原始最簡單整數比後項=5 3.原始小數題目前項=20.7 4.原始小數題目後項=1.15 5.新的最簡單整數比前項2070 6.新的最簡單整數比後項115 7.用新的最簡單整數比求出最大公因數=6 8.本題最後的答案前項=345 9.本題最後的答案後項=19.1666666666667 看看第5、6、7條 2070和115的最大公因數怎麼會是6呢?(所以才會導致第9條無法整除) 由於我讓輸入進去的數字無條件捨去法到整數 所以有可能本來第6條只是114.9999999.............., 然後無條件捨去後變成114 此時2070和114的最大公因數就是6 這是我的猜測啦 所以我的gcd函數是改成 a=Math.round(Math.max(int1,int2)); b=Math.round(Math.max(int1,int2)); 此時就不會有這樣的問題了(有用excel做過檢驗 至少跑幾百次後都不會有問題) 唉....trace列出來是這個樣子 可是跑出來卻不是這個樣子.... 真是令人難以理解.... 另外我很好奇且有疑問的是 我的說明之中 random只有 *************** random 適用版本 Flash Player 4。Flash 5 已不建議使用這個函數而改用 Math.random()。 用法 random(value) 參數 value 是一個整數 傳回值 一個整數 說明 函數;傳回介於 0 和一個小於 value 參數中指定整數的隨機整數。 範例 以下 random() 的使用會傳回值 0、1、2、3 或 4: random(5); 請參閱 Math.random() ***************** Math.random()只有 ***************** Math.random() 適用版本 Flash Player 5。在 Flash Player 4 中, Math 類別的方法和屬性是使用近似值來模擬, 正確性可能不如 Flash Player 5 所支援的-非模擬數學函數。 用法 Math.random() 參數 無 傳回值 一個數字 說明 方法;傳回 n,其中 0 <= n < 1。 請參閱 random ****************** 並沒有您所說的範例耶 還是我漏了哪些東西沒有安裝或是沒看到呢??版本是2004 mx professtional (而更奇怪的是 我記得哪裡有看過類似您所提供的randRange函數 好像是vb還是php的說明文件??) 最後 感謝您的回答.... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.141.15.61
文章代碼(AID): #15N-PzGu (Flash)
討論串 (同標題文章)
文章代碼(AID): #15N-PzGu (Flash)