作者etrexetrex (moonet)
看板Flash
标题Re: [问题] 请问测验题想要随机出现该怎麽做?
时间Thu Apr 3 02:00:30 2008
※ 引述《cjcat2266 (CJ Cat)》之铭言:
: ※ 引述《woodymonkey (小罐的吃太快)》之铭言:
: : 如果不出现一样的问题:
: : 将所有的问题放在主场景的不同影格,
: : 然後产生一个阵列Array(20),用回圈将随机数字放入此阵列,
: : 阵列每一个元素内的数字注意不可重复。
: : 定义一个全域变数y,初始值为0。
: : 答对时用gotoAndPlay(Array(y)),并且将y加1。
: 想到另外一招
: 如果你有20格,就先让个Array装1~20
: var array:Array = new Array();
: for (var i:int = 0; i < 20; i++) {
: array[i] = i + 1;
: } //得到 [1, 2, 3, ..., 20]
: 然後用random决定这个Array里面的一个数字
: 用过之後就把这个数字从Array里面拔掉
: 之後再random决定的时候就绝对不会选到这个数字
: if (array.length == ) {
: //没题目了,跳到结尾
: }
: var targetFrame:int = array[Math.floor((Math.random() * array.length))];
: array = array.splice(targetFrame, 1); //拔掉用过的数字
: gotoAndPlay(targetFrame);
其实产生不重复乱数有一个几乎是最佳解的方法
//设定值
var array:Array = new Array();
for (var i = 0 ; i< 20 ; i++)
array[i] = i;
//乱数选择排序
for (var i = 0 ; i <19 ; i++)
{
//选择 从 i 到 19 中选择一个
var rand = int(Math.random()*(20-i)) + i;
//交换
var temp = array[i];
array[i] = array[rand];
array[rand]=temp;
}
没编译过,但逻辑上就是这样
请把程式码当虚拟码看看就好
如果真的可以执行,那只是凑巧
--
http://etrex.blogspot.com/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.231.71.124
1F:推 no1kk:这好像是所谓的洗牌原理,把52张牌顺序搅乱之後再依序发牌 04/03 03:31
2F:→ no1kk:只是在取乱数的时候不用限制取i~19,直接random(20)就好了 04/03 03:32
3F:→ etrexetrex:洗牌的方法 是说洗越多次会越乱 但这个不是 04/03 09:50
4F:→ etrexetrex:这个保证是真正乱的 04/03 09:50
5F:→ etrexetrex:逻辑上来讲 这演算法比较接近排序 04/03 09:53
6F:推 aquarianboy:小的在1950篇就有附个原始档罗,供大家参考 :) 04/03 11:41