So I’m working on this script. When I’m done with it, it should be used for making 2-and-2 groups. But anyway; The ‘input’ array in the start of the script, will get 22 different inputs from my HTML file. As a standard, I gave them the values 1-22. The thing is my two blocks ‘1st number’ and ‘2nd number’ doesn’t work very well: they don’t return the right numbers. Cause I want every elev[x] to be used once! Not 2 times, not 0 times, once! And the blocks returns like some of them twice and some of them isn’t even used. So how can I fix this?
function Calculate(){
var elev = [];
var inputs = document.getElementsByName("txt");
for(i=0; i<inputs.length; i++) {
elev[i] = {
"Value": inputs[i].value,
"Used": false
};
}
function shuffle(elev){
var len = elev.length;
for(i=1; i<len; i++){
j = ~~(Math.random()*(i+1));
var temp = elev[i];
arr[i] = elev[j];
arr[j] = temp;
}
}
for(var v=0; v<1; v++) {
shuffle(elev);
document.write(elev + '<br/>\n');
}}
Yes, I’m still new at programming and I just wanna learn what I can learn.
Problem solved by doing the Fisher-Yates shuffle.
The idea of shuffling an array and iterating over it is correct, however, sorting by a coin-flipping comparator (a common mis-implementation; suggested by the other answer) is not the correct way to shuffle an array; it produces very skewed results and is not even guaranteed to finish.
Unless you’re willing to fetch underscore.js (
arr = _.shuffle(arr)), It is recommended to use the Fisher-Yates shuffle:also, note that object fields should be lowercase, not uppercase (
value', not 'Value'). Also, theUsed` field should not be neccessary since you now iterate in order. Also, any chance you could use an array of Values? They seem to be the only field in your objects.Also, Don’t use document.write(). It doesn’t work as expected when used after the page load. If you want to append something to the document, you hate jQuery and other frameworks and you don’t want to go the long way of creating and composing DOM nodes,
document.body.innerHTML +=is still better thandocument.write()(but still consider appendingDocumentFragments instead’).demo: http://jsfiddle.net/honnza/2GSDd/1/