An array is generated to contain the numbers within the range selected.
The random number generated will correspond with an array [index], the number that resides at this index is then the chosen number.
The chosen number is then removed from the array and the array length shortened by one.
<script type="text/javascript">
<!--
// Realise by apachejeff
// www.huntingground.freeserve.co.uk
function init(){
minNumber=1+Math.floor(document.f1.MinNum.value-1) // min input
maxNumber=Math.floor(document.f1.MaxNum.value) // max input
selectCount=Math.floor(document.f1.selec.value) //amount input
numbersRange=new Array() // array to hold numbers to select from. max - min
selectedNum=new Array() // array to hold selected numbers
numCount=maxNumber-minNumber // how many to choose from
if(selectCount>maxNumber){ // check to make sure number to select not higher than maxNumber
document.f1.selected_display.style.color="#FF0000"
document.f1.selected_display.value="Oops...\nYou have selected a higher number than the "
+ maxNumber+" numbers available\nPlease select again :)" // alert
return
}
if(minNumber>maxNumber){ // check to make sure minNumber not higher than maxNumber
document.f1.selected_display.style.color="#FF0000"
document.f1.selected_display.value="Oops...\nYour lowest number "+ minNumber
+" is higher than the maximum number of "+ maxNumber+" \nPlease select again :)" // alert
return
}
if(selectCount>(maxNumber-minNumber)+1){ // check to make sure selectCount within numbers range
Range=maxNumber-minNumber+1
document.f1.selected_display.style.color="#FF0000"
document.f1.selected_display.value="Oops...\nYour selection is greater than the "+Range
+" numbers available. \nPlease select again :)" // alert
return
}
if(minNumber==0){ // keep lowest value to one
document.f1.MinNum.value=1
}
for(n=0;n<numCount+1;n++){ // create list of numbers to choose from
numbersRange[n]=minNumber // start of numbers to choose from
minNumber++
}
for(p=0;p<selectCount;p++){ // generate a random number for selectCount times
rndnum=Math.round(Math.random()*(numCount))
chosenNumber=numbersRange.splice(rndnum,1) // select and remove selected number from array
selectedNum[p]=chosenNumber // create array of selected numbers
showMe=selectedNum.sort(compareNumbers) // sort selected numbers
numCount-- // decrease by 1
document.f1.selected_display.style.color="#0000FF"
document.f1.selected_display.value=showMe // display selected numbers
}
}
function compareNumbers(a, b) {
return a - b}
// -->
</script>
<center><form name="f1">Example: Choosing 3 numbers from 5 numbers ranging from 16 to 20
|
You can see from this example that when a number has been selected the array index decreases by one and the number selected is removed. The remaining numbers are then relisted in the array. When the three random numbers have been selected only the two unselected numbers are left in the array. Because the array length is decreased by one after a number has been selected it is possible for the same index number to hold a different number within the range. Result: 18, 16, 20 |
1st pass, Random Number = 2, Chosen number = 18 | |||
| Array Index | Number Range | Revised Array Index | Remaining Number Range | |
| 0 1 2 3 4 |
16 17 18 19 20 |
0 1 2 3 |
16 17 19 20 |
|
| 2nd pass, Random Number = 0, Chosen number = 16 | ||||
| Array Index | Number Range | Revised Array Index | Remaining Number Range | |
| 0 1 2 3 |
16 17 19 20 |
0 1 2 |
17 19 20 |
|
| 3rd pass, Random Number = 2, Chosen number = 20 | ||||
| Array Index | Number Range | Revised Array Index | Remaining Number Range | |
| 0 1 2 |
17 19 20 |
0 1 |
17 19 |
|