Re: [問題] 想請問flash高手...這程式哪裡出問題?
※ 引述《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
討論串 (同標題文章)
Flash 近期熱門文章
PTT數位生活區 即時熱門文章