celus
-
Posts
3 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Posts posted by celus
-
-
Hi everybody
I'm not saying the Math.random() function isn't random enough.
(I should have posted my text under suggestions.)
I think the different browsers have different sorting algorithms in the background.
Even if the random number generator is good, the sorting algorithm of most browsers doesn't treat all numbers in the array the same. As it seems to me, in most browsers the last element of the array is inserted/sorted last. Now if we define the sorting function e.g. as a < b, if the last element in the array is the smallest, it moves through the whole array. But if we define it as Math.random()<0.5, it is unlikely that the last element will move far from its place. Of course this depends on the sorting algorithm in the background. That's why I tested it with different browsers. Of course I executed my script many times. If the sorting is tested for 100'000 times, the results show the same problem.
-
Hi everybodyIf I'm right, the JS-Tutorial about sorting arrays randomly has a lack. The order of the array is kind of in a random order at the first glance, but the elements often stay at the same place as they were. This is true in the most for the element at the end of the array and the effect happens in most browsers, but not in all of them. I've written a script to test this. In these browsers the elements are not evenly distributed as they should: Chrome, IE, Edge, Opera. In Safari they were evenly distributed when I tried it. Try it yourself.
<!DOCTYPE html> <html> <body> <p id="demo"></p> <script> var sum; var points; var i, j; sum = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]; for (i=0;i<1000;i++){ points = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1]; points.sort(function(a, {return 0.5 - Math.random()}); for (j=0;j<points.length;j++){ sum[j]+=points[j]; } } document.getElementById("demo").innerHTML = sum; </script> </body> </html>
What the code does: It creates an array with a leading 1 and a 1 at the last place and zeroes between (points). Then it sorts this array randomly and adds the resulting array to a sum array. Then it starts again with the specific array. The generating, sorting and adding is done a 1000 times. When you reload the page the summed up numbers are displayed.
Result: In many browsers the last number is higher than the others, which shouldn't happen with correct random sorting.Cheers,
celus- 1
js-tutorial array sorting - sorting randomly
in JavaScript
Posted · Edited by celus
Hello
Thanks for your answer. The script you posted shows an equal distribution, that's true. I tried changing it the following way to spot the difference of your script and mine: I moved the line var points = ... in the loop:
It seems in the line
the Array points gets changed. I wanted to reset it every time the outer loop repeates itself.