/**
* Generates an array of random numbers from 1 or 0 to max
where all numbers through max are used, and no number is zero (if specified).
* Specify true if no zeros are to be included, specify false
if zeros are to be included in the resulting array.
* @param max the maximum range for the numbers.
* @param useZero Specify true if no zeros are to be
included, specify false if zeros are to be included in the resulting array.
* @return an array of random numbers where no number is the
same.
* */
public static function rndNumArray(max:int,
useZero:Boolean=false):Array
{
var array:Array = [];
for (var i1:int = 0; i1 < max; i1++)
{
array.push("");
}
var i2:int = 0;
while (i2 < array.length)
{
var rndNum:Number = rndNum(0, max);
if (!containedInArray(rndNum, array) )
{
//if (useZero) rndNum = rndNum-1;
array[i2] = rndNum;
i2++;
}
}
if (useZero)
{
var arrLen:int = array.length;
for (var i3:int = 0; i3 < arrLen; i3++)
{
array[i3] = array[i3]-1;
}
}
return array;
}
/**
* Generates a random number within the given range.
*
* @example <listing version=<3.0">
* var myRandomNumber:Number = rndNum(2, 13);<br/>
* trace(myRandomNumber); //returns 7 (a random between 2 and
13)
* </listing>
* @param minVal the minimum number for the range.
* @param maxVal the maxiumum number for the range.
* @return returns the random number generated.
*
* */
public static function rndNum(minVal:Number,
maxVal:Number):Number
{
return minVal +
Math.floor(Math.random()*(maxVal+1-minVal));
}
Jason Merrill
Bank of America Global Learning
Learning & Performance Solutions
Join the Bank of America Flash Platform Community and visit our Instructional
Technology Design Blog
(note: these are for Bank of America employees only)
-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of
[email protected]
Sent: Thursday, May 06, 2010 5:03 AM
To: Flash Coders List
Subject: Re: [Flashcoders] Producing a random list with no repeats
I always use Fisher-Yates shuffle method to randomise an Array, which yields
more unbiased result.
http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
My AS3 interpretation of Fisher-Yates is as follows; I can just call this from
anywhere in my scripts ;)
package utils {
public function fisherYates(arr:Array):void {
var i:uint = arr.length;
while(--i){
var j:uint = Math.floor(Math.random()*(i + 1));
var tmpI:Object = arr[i];
var tmpJ:Object = arr[j];
arr[i] = tmpJ;
arr[j] = tmpI;
}
}
}
--
Kenneth Kawamoto
http://www.materiaprima.co.uk/
On 6 May 2010 02:27, Juan Pablo Califano <[email protected]>
wrote:
> A simple way:
>
> Put all the candidate numbers in a list (in this case, 1 to 40). Then
> pick randomly from that array, one at the time, and make sure you
> remove that number from the candidates list, so you can't have duplicates.
>
> In code (untested):
>
> function getRandomList():Array {
> var min:Number = 1;
> var max:Number = 40;
> var numItems:Number = 10;
> var candidates:Array = [];
> // fill up the candidates list with the "eligible" numbers
> for(var i:Number = min; i <= max; i++) {
> candidates.push(i);
> }
>
> var list:Array = [];
> var idx:Number = 0;
> var selectedNumber:Number = 0;
> for(i = 0; i < numItems; i++) {
> // get a number from the candidates list, randomly. Add it to
> the result and remove it from the candidates list (using splice)
> idx = Math.floor(Math.random() * candidates.length);
> selectedNumber = candidates.splice(idx,1)[0];
> list.push(selectedNumber);
> }
> return list;
> }
>
>
> Cheers
> Juan Pablo Califano
>
> 2010/5/5 Alan Neilsen <[email protected]>
>
>> I am working in ActionScript 2. I want to create a quiz in which 10
>> questions are randomly selected from a block of 40 questions. I found
>> the following code, but I can't work out how to stop it doubling up
>> the questions.
>>
>> function randRange(min:Number, max:Number):Number {
>> var randomNum:Number = Math.floor(Math.random() * (max - min + 1))
>> + min;
>> return randomNum;
>> }
>> for (var i = 0; i < 10; i++) {
>> var n:Number = randRange(1, 40)
>> trace(n);
>> }
>>
>> When I run this it outputs a list of numbers like 40 13 17 12 27
>> 12 3
>> 17 9 15 which means some questions (in this case 17 and 12) will
>> appear twice in my quiz.
>> Bearing in mind that I am a bit of an ActionScript dummy, can anybody
>> suggest a way to modify the above script to prevent the same number
>> being generated more than once.
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders
_______________________________________________
Flashcoders mailing list
[email protected]
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders