作者jonathanmeow (喵)
看板Flash
标题Re: [问题] 想请问flash高手...这程式哪里出问题?
时间Sun Nov 19 13:50:02 2006
※ 引述《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