Sorting an Array in Random Order
up vote
12
down vote
favorite
I'm trying to understand how sorting an array in random order works. So, I found the following code:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
my main question is why they use 0.5 not another number?
and how it really works please try to make it simple i'm new in javascript and i'm struggling with these things
javascript arrays algorithm sorting random
|
show 3 more comments
up vote
12
down vote
favorite
I'm trying to understand how sorting an array in random order works. So, I found the following code:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
my main question is why they use 0.5 not another number?
and how it really works please try to make it simple i'm new in javascript and i'm struggling with these things
javascript arrays algorithm sorting random
Why you passedfunc
into yoursort()
function for sorting an array of string ?
– KolaCaine
Dec 3 at 10:26
4
terminologically it's notsorting
butshuffling
usingsort
function
– sertsedat
Dec 3 at 10:38
1
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
6
This is a bad idea - the sort predicate should be consistent. If for whatever reason you comparea
andb
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)
– MSalters
Dec 3 at 11:55
2
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07
|
show 3 more comments
up vote
12
down vote
favorite
up vote
12
down vote
favorite
I'm trying to understand how sorting an array in random order works. So, I found the following code:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
my main question is why they use 0.5 not another number?
and how it really works please try to make it simple i'm new in javascript and i'm struggling with these things
javascript arrays algorithm sorting random
I'm trying to understand how sorting an array in random order works. So, I found the following code:
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
my main question is why they use 0.5 not another number?
and how it really works please try to make it simple i'm new in javascript and i'm struggling with these things
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
javascript arrays algorithm sorting random
javascript arrays algorithm sorting random
edited Dec 11 at 8:13
rv7
2,1751323
2,1751323
asked Dec 3 at 10:22
Med Amine Elwere
746
746
Why you passedfunc
into yoursort()
function for sorting an array of string ?
– KolaCaine
Dec 3 at 10:26
4
terminologically it's notsorting
butshuffling
usingsort
function
– sertsedat
Dec 3 at 10:38
1
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
6
This is a bad idea - the sort predicate should be consistent. If for whatever reason you comparea
andb
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)
– MSalters
Dec 3 at 11:55
2
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07
|
show 3 more comments
Why you passedfunc
into yoursort()
function for sorting an array of string ?
– KolaCaine
Dec 3 at 10:26
4
terminologically it's notsorting
butshuffling
usingsort
function
– sertsedat
Dec 3 at 10:38
1
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
6
This is a bad idea - the sort predicate should be consistent. If for whatever reason you comparea
andb
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)
– MSalters
Dec 3 at 11:55
2
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07
Why you passed
func
into your sort()
function for sorting an array of string ?– KolaCaine
Dec 3 at 10:26
Why you passed
func
into your sort()
function for sorting an array of string ?– KolaCaine
Dec 3 at 10:26
4
4
terminologically it's not
sorting
but shuffling
using sort
function– sertsedat
Dec 3 at 10:38
terminologically it's not
sorting
but shuffling
using sort
function– sertsedat
Dec 3 at 10:38
1
1
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
6
6
This is a bad idea - the sort predicate should be consistent. If for whatever reason you compare
a
and b
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)– MSalters
Dec 3 at 11:55
This is a bad idea - the sort predicate should be consistent. If for whatever reason you compare
a
and b
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)– MSalters
Dec 3 at 11:55
2
2
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07
|
show 3 more comments
6 Answers
6
active
oldest
votes
up vote
7
down vote
accepted
You used
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
And here the most important thing is as.sort(func)
.
func(a,b)
will return value in range of [-0.5,0.5]
.
Because this function return 0.5 - Math.random()
and Math.random() will return the float value which is in range of [0,1]
.
So that your func
will return value in range of [-0.5,0.5]
.
And this mean that sort order will be set increase
or decrease
.
this is random.
So your result will be random
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
1
Crucially, a value of0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.
– BallpointBen
Dec 3 at 18:20
2
@BallpointBen That's simply wrong. UsingMath.random()
insort
does not lead to unbiased results.
– Bergi
Dec 3 at 20:00
add a comment |
up vote
8
down vote
Math.random() returns a number between 0 and 1
(exclusive). We're using 0.5
because it is the mean value.
Array.sort() sorts the parameters based on the return value. So, 0.5 - Math.random()
will yield either positive or negative value with equal probability. Hence, it will sort the parameters randomly.
How it really works
- If the return value of
Array.sort
is positive, then the index of the
first parameter will be higher than that of the second. - If it is negative, then the index of the second parameter will be
higher than that of the first. - And, if it is
0
, then do nothing.
add a comment |
up vote
6
down vote
Math.random() return random value between 0 to 1 (0 is included but 1 is excluded).
So 0.5 act as mid point. If use use value like greater than 1 or less 0 than it will always be either true or false.
So for this reason 0.5 is used.
You can read more here about Math.random()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Let's understand it bit more with examples
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
This is what you get when you use value greater than 1
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
This is what happens when you use value less than 0
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S :-
Try printing output from all the above condition you will see that last two condition will always return either true or false from function. so you will not get a random sorting.
Now talk about any value from 0 to 0.99 you can use any value but 0.5 will serve your purpose best.Because it's a middle point you're most likely to get best answer.
add a comment |
up vote
1
down vote
Math.random
returns a number between 0 and 1.
Sorting function use the return value x
as the following :
x == 0
: Same value, can order "how it wants"x < 0
: the first object is less than the second one, therefore its index in the sorted array will be less than the other'sx > 0
same asx < 0
but the other way around
Since Math.random
returns a number between 0 and 1 and we want to also get negative numbers, we must subtract some value.
Here 0.5 - Math.random()
would give a number between 0.5 and -0.5
add a comment |
up vote
0
down vote
If you call the sort
method with a function parameter is called several times. This function should accept two parameters (let's call the first A and the second B) Each time it should return a value:
- Less than zero, if A < B
- Equal to zero, if A = B
- Greater the zero, if A > B
So in this example we need random return values that evenly distribute negative and positive values. Since Math.random()
returns a value between 0 and 1, 0.5 - Math.random()
will return values between -0.5 and 0.5, which meets the requirements.
add a comment |
up vote
0
down vote
If you just want to nudge the elements near their starting positions in a random way, sure, use sort
with random
, but in most cases, that's not what you want. You want to thoroughly shuffle an array, completely randomize the position of every element. And for that random
in the built-in sort
function is a terrible practice, because it is biased towards the initial state, meaning that the elements in the "shuffled" array will tend to stay near their positions (those that were near the beginning have the high probability of staying near the beginning, etc...). The bigger the size the array grows, the less it gets shuffled.
Here is the proof: Is it correct to use JavaScript Array.sort() method for shuffling?
And here is the function for shuffling arrays I use most of the time. It thoroughly randomizes the position of every element.
function shuffle(arr) { // randomly rearanges the items in an array
const result = ;
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53591691%2fsorting-an-array-in-random-order%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
6 Answers
6
active
oldest
votes
6 Answers
6
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
7
down vote
accepted
You used
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
And here the most important thing is as.sort(func)
.
func(a,b)
will return value in range of [-0.5,0.5]
.
Because this function return 0.5 - Math.random()
and Math.random() will return the float value which is in range of [0,1]
.
So that your func
will return value in range of [-0.5,0.5]
.
And this mean that sort order will be set increase
or decrease
.
this is random.
So your result will be random
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
1
Crucially, a value of0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.
– BallpointBen
Dec 3 at 18:20
2
@BallpointBen That's simply wrong. UsingMath.random()
insort
does not lead to unbiased results.
– Bergi
Dec 3 at 20:00
add a comment |
up vote
7
down vote
accepted
You used
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
And here the most important thing is as.sort(func)
.
func(a,b)
will return value in range of [-0.5,0.5]
.
Because this function return 0.5 - Math.random()
and Math.random() will return the float value which is in range of [0,1]
.
So that your func
will return value in range of [-0.5,0.5]
.
And this mean that sort order will be set increase
or decrease
.
this is random.
So your result will be random
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
1
Crucially, a value of0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.
– BallpointBen
Dec 3 at 18:20
2
@BallpointBen That's simply wrong. UsingMath.random()
insort
does not lead to unbiased results.
– Bergi
Dec 3 at 20:00
add a comment |
up vote
7
down vote
accepted
up vote
7
down vote
accepted
You used
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
And here the most important thing is as.sort(func)
.
func(a,b)
will return value in range of [-0.5,0.5]
.
Because this function return 0.5 - Math.random()
and Math.random() will return the float value which is in range of [0,1]
.
So that your func
will return value in range of [-0.5,0.5]
.
And this mean that sort order will be set increase
or decrease
.
this is random.
So your result will be random
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
You used
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
And here the most important thing is as.sort(func)
.
func(a,b)
will return value in range of [-0.5,0.5]
.
Because this function return 0.5 - Math.random()
and Math.random() will return the float value which is in range of [0,1]
.
So that your func
will return value in range of [-0.5,0.5]
.
And this mean that sort order will be set increase
or decrease
.
this is random.
So your result will be random
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
edited Dec 3 at 10:47
answered Dec 3 at 10:29
Jin
560219
560219
1
Crucially, a value of0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.
– BallpointBen
Dec 3 at 18:20
2
@BallpointBen That's simply wrong. UsingMath.random()
insort
does not lead to unbiased results.
– Bergi
Dec 3 at 20:00
add a comment |
1
Crucially, a value of0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.
– BallpointBen
Dec 3 at 18:20
2
@BallpointBen That's simply wrong. UsingMath.random()
insort
does not lead to unbiased results.
– Bergi
Dec 3 at 20:00
1
1
Crucially, a value of
0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.– BallpointBen
Dec 3 at 18:20
Crucially, a value of
0.5
makes the probability that one element is evaluated to be less than another exactly 1/2, which makes the random sort unbiased with respect to the initial order of the list.– BallpointBen
Dec 3 at 18:20
2
2
@BallpointBen That's simply wrong. Using
Math.random()
in sort
does not lead to unbiased results.– Bergi
Dec 3 at 20:00
@BallpointBen That's simply wrong. Using
Math.random()
in sort
does not lead to unbiased results.– Bergi
Dec 3 at 20:00
add a comment |
up vote
8
down vote
Math.random() returns a number between 0 and 1
(exclusive). We're using 0.5
because it is the mean value.
Array.sort() sorts the parameters based on the return value. So, 0.5 - Math.random()
will yield either positive or negative value with equal probability. Hence, it will sort the parameters randomly.
How it really works
- If the return value of
Array.sort
is positive, then the index of the
first parameter will be higher than that of the second. - If it is negative, then the index of the second parameter will be
higher than that of the first. - And, if it is
0
, then do nothing.
add a comment |
up vote
8
down vote
Math.random() returns a number between 0 and 1
(exclusive). We're using 0.5
because it is the mean value.
Array.sort() sorts the parameters based on the return value. So, 0.5 - Math.random()
will yield either positive or negative value with equal probability. Hence, it will sort the parameters randomly.
How it really works
- If the return value of
Array.sort
is positive, then the index of the
first parameter will be higher than that of the second. - If it is negative, then the index of the second parameter will be
higher than that of the first. - And, if it is
0
, then do nothing.
add a comment |
up vote
8
down vote
up vote
8
down vote
Math.random() returns a number between 0 and 1
(exclusive). We're using 0.5
because it is the mean value.
Array.sort() sorts the parameters based on the return value. So, 0.5 - Math.random()
will yield either positive or negative value with equal probability. Hence, it will sort the parameters randomly.
How it really works
- If the return value of
Array.sort
is positive, then the index of the
first parameter will be higher than that of the second. - If it is negative, then the index of the second parameter will be
higher than that of the first. - And, if it is
0
, then do nothing.
Math.random() returns a number between 0 and 1
(exclusive). We're using 0.5
because it is the mean value.
Array.sort() sorts the parameters based on the return value. So, 0.5 - Math.random()
will yield either positive or negative value with equal probability. Hence, it will sort the parameters randomly.
How it really works
- If the return value of
Array.sort
is positive, then the index of the
first parameter will be higher than that of the second. - If it is negative, then the index of the second parameter will be
higher than that of the first. - And, if it is
0
, then do nothing.
edited Dec 3 at 14:52
wjandrea
9471228
9471228
answered Dec 3 at 10:27
rv7
2,1751323
2,1751323
add a comment |
add a comment |
up vote
6
down vote
Math.random() return random value between 0 to 1 (0 is included but 1 is excluded).
So 0.5 act as mid point. If use use value like greater than 1 or less 0 than it will always be either true or false.
So for this reason 0.5 is used.
You can read more here about Math.random()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Let's understand it bit more with examples
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
This is what you get when you use value greater than 1
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
This is what happens when you use value less than 0
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S :-
Try printing output from all the above condition you will see that last two condition will always return either true or false from function. so you will not get a random sorting.
Now talk about any value from 0 to 0.99 you can use any value but 0.5 will serve your purpose best.Because it's a middle point you're most likely to get best answer.
add a comment |
up vote
6
down vote
Math.random() return random value between 0 to 1 (0 is included but 1 is excluded).
So 0.5 act as mid point. If use use value like greater than 1 or less 0 than it will always be either true or false.
So for this reason 0.5 is used.
You can read more here about Math.random()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Let's understand it bit more with examples
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
This is what you get when you use value greater than 1
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
This is what happens when you use value less than 0
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S :-
Try printing output from all the above condition you will see that last two condition will always return either true or false from function. so you will not get a random sorting.
Now talk about any value from 0 to 0.99 you can use any value but 0.5 will serve your purpose best.Because it's a middle point you're most likely to get best answer.
add a comment |
up vote
6
down vote
up vote
6
down vote
Math.random() return random value between 0 to 1 (0 is included but 1 is excluded).
So 0.5 act as mid point. If use use value like greater than 1 or less 0 than it will always be either true or false.
So for this reason 0.5 is used.
You can read more here about Math.random()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Let's understand it bit more with examples
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
This is what you get when you use value greater than 1
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
This is what happens when you use value less than 0
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S :-
Try printing output from all the above condition you will see that last two condition will always return either true or false from function. so you will not get a random sorting.
Now talk about any value from 0 to 0.99 you can use any value but 0.5 will serve your purpose best.Because it's a middle point you're most likely to get best answer.
Math.random() return random value between 0 to 1 (0 is included but 1 is excluded).
So 0.5 act as mid point. If use use value like greater than 1 or less 0 than it will always be either true or false.
So for this reason 0.5 is used.
You can read more here about Math.random()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
Let's understand it bit more with examples
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
This is what you get when you use value greater than 1
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
This is what happens when you use value less than 0
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
P.S :-
Try printing output from all the above condition you will see that last two condition will always return either true or false from function. so you will not get a random sorting.
Now talk about any value from 0 to 0.99 you can use any value but 0.5 will serve your purpose best.Because it's a middle point you're most likely to get best answer.
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 0.5 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return 1 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
var as = ["max","jack","sam"];
var s = as.sort(func);
function func(a, b) {
return -1 - Math.random();
}
console.log(s);
edited Dec 3 at 10:40
answered Dec 3 at 10:26
Code Maniac
2,152116
2,152116
add a comment |
add a comment |
up vote
1
down vote
Math.random
returns a number between 0 and 1.
Sorting function use the return value x
as the following :
x == 0
: Same value, can order "how it wants"x < 0
: the first object is less than the second one, therefore its index in the sorted array will be less than the other'sx > 0
same asx < 0
but the other way around
Since Math.random
returns a number between 0 and 1 and we want to also get negative numbers, we must subtract some value.
Here 0.5 - Math.random()
would give a number between 0.5 and -0.5
add a comment |
up vote
1
down vote
Math.random
returns a number between 0 and 1.
Sorting function use the return value x
as the following :
x == 0
: Same value, can order "how it wants"x < 0
: the first object is less than the second one, therefore its index in the sorted array will be less than the other'sx > 0
same asx < 0
but the other way around
Since Math.random
returns a number between 0 and 1 and we want to also get negative numbers, we must subtract some value.
Here 0.5 - Math.random()
would give a number between 0.5 and -0.5
add a comment |
up vote
1
down vote
up vote
1
down vote
Math.random
returns a number between 0 and 1.
Sorting function use the return value x
as the following :
x == 0
: Same value, can order "how it wants"x < 0
: the first object is less than the second one, therefore its index in the sorted array will be less than the other'sx > 0
same asx < 0
but the other way around
Since Math.random
returns a number between 0 and 1 and we want to also get negative numbers, we must subtract some value.
Here 0.5 - Math.random()
would give a number between 0.5 and -0.5
Math.random
returns a number between 0 and 1.
Sorting function use the return value x
as the following :
x == 0
: Same value, can order "how it wants"x < 0
: the first object is less than the second one, therefore its index in the sorted array will be less than the other'sx > 0
same asx < 0
but the other way around
Since Math.random
returns a number between 0 and 1 and we want to also get negative numbers, we must subtract some value.
Here 0.5 - Math.random()
would give a number between 0.5 and -0.5
answered Dec 3 at 10:31
Vivick
1,2461317
1,2461317
add a comment |
add a comment |
up vote
0
down vote
If you call the sort
method with a function parameter is called several times. This function should accept two parameters (let's call the first A and the second B) Each time it should return a value:
- Less than zero, if A < B
- Equal to zero, if A = B
- Greater the zero, if A > B
So in this example we need random return values that evenly distribute negative and positive values. Since Math.random()
returns a value between 0 and 1, 0.5 - Math.random()
will return values between -0.5 and 0.5, which meets the requirements.
add a comment |
up vote
0
down vote
If you call the sort
method with a function parameter is called several times. This function should accept two parameters (let's call the first A and the second B) Each time it should return a value:
- Less than zero, if A < B
- Equal to zero, if A = B
- Greater the zero, if A > B
So in this example we need random return values that evenly distribute negative and positive values. Since Math.random()
returns a value between 0 and 1, 0.5 - Math.random()
will return values between -0.5 and 0.5, which meets the requirements.
add a comment |
up vote
0
down vote
up vote
0
down vote
If you call the sort
method with a function parameter is called several times. This function should accept two parameters (let's call the first A and the second B) Each time it should return a value:
- Less than zero, if A < B
- Equal to zero, if A = B
- Greater the zero, if A > B
So in this example we need random return values that evenly distribute negative and positive values. Since Math.random()
returns a value between 0 and 1, 0.5 - Math.random()
will return values between -0.5 and 0.5, which meets the requirements.
If you call the sort
method with a function parameter is called several times. This function should accept two parameters (let's call the first A and the second B) Each time it should return a value:
- Less than zero, if A < B
- Equal to zero, if A = B
- Greater the zero, if A > B
So in this example we need random return values that evenly distribute negative and positive values. Since Math.random()
returns a value between 0 and 1, 0.5 - Math.random()
will return values between -0.5 and 0.5, which meets the requirements.
edited Dec 3 at 14:19
gsamaras
49.9k2398181
49.9k2398181
answered Dec 3 at 10:31
HerrSerker
19.7k84777
19.7k84777
add a comment |
add a comment |
up vote
0
down vote
If you just want to nudge the elements near their starting positions in a random way, sure, use sort
with random
, but in most cases, that's not what you want. You want to thoroughly shuffle an array, completely randomize the position of every element. And for that random
in the built-in sort
function is a terrible practice, because it is biased towards the initial state, meaning that the elements in the "shuffled" array will tend to stay near their positions (those that were near the beginning have the high probability of staying near the beginning, etc...). The bigger the size the array grows, the less it gets shuffled.
Here is the proof: Is it correct to use JavaScript Array.sort() method for shuffling?
And here is the function for shuffling arrays I use most of the time. It thoroughly randomizes the position of every element.
function shuffle(arr) { // randomly rearanges the items in an array
const result = ;
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
add a comment |
up vote
0
down vote
If you just want to nudge the elements near their starting positions in a random way, sure, use sort
with random
, but in most cases, that's not what you want. You want to thoroughly shuffle an array, completely randomize the position of every element. And for that random
in the built-in sort
function is a terrible practice, because it is biased towards the initial state, meaning that the elements in the "shuffled" array will tend to stay near their positions (those that were near the beginning have the high probability of staying near the beginning, etc...). The bigger the size the array grows, the less it gets shuffled.
Here is the proof: Is it correct to use JavaScript Array.sort() method for shuffling?
And here is the function for shuffling arrays I use most of the time. It thoroughly randomizes the position of every element.
function shuffle(arr) { // randomly rearanges the items in an array
const result = ;
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
add a comment |
up vote
0
down vote
up vote
0
down vote
If you just want to nudge the elements near their starting positions in a random way, sure, use sort
with random
, but in most cases, that's not what you want. You want to thoroughly shuffle an array, completely randomize the position of every element. And for that random
in the built-in sort
function is a terrible practice, because it is biased towards the initial state, meaning that the elements in the "shuffled" array will tend to stay near their positions (those that were near the beginning have the high probability of staying near the beginning, etc...). The bigger the size the array grows, the less it gets shuffled.
Here is the proof: Is it correct to use JavaScript Array.sort() method for shuffling?
And here is the function for shuffling arrays I use most of the time. It thoroughly randomizes the position of every element.
function shuffle(arr) { // randomly rearanges the items in an array
const result = ;
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
If you just want to nudge the elements near their starting positions in a random way, sure, use sort
with random
, but in most cases, that's not what you want. You want to thoroughly shuffle an array, completely randomize the position of every element. And for that random
in the built-in sort
function is a terrible practice, because it is biased towards the initial state, meaning that the elements in the "shuffled" array will tend to stay near their positions (those that were near the beginning have the high probability of staying near the beginning, etc...). The bigger the size the array grows, the less it gets shuffled.
Here is the proof: Is it correct to use JavaScript Array.sort() method for shuffling?
And here is the function for shuffling arrays I use most of the time. It thoroughly randomizes the position of every element.
function shuffle(arr) { // randomly rearanges the items in an array
const result = ;
for (let i = arr.length-1; i >= 0; i--) {
// picks an integer between 0 and i:
const r = Math.floor(Math.random()*(i+1)); // NOTE: use a better RNG if cryptographic security is needed
// inserts the arr[i] element in the r-th free space in the shuffled array:
for(let j = 0, k = 0; j <= arr.length-1; j++) {
if(result[j] === undefined) {
if(k === r) {
result[j] = arr[i]; // NOTE: if array contains objects, this doesn't clone them! Use a better clone function instead, if that is needed.
break;
}
k++;
}
}
}
return result;
}
edited Dec 8 at 7:27
answered Dec 8 at 7:21
Kresimir
48015
48015
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53591691%2fsorting-an-array-in-random-order%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Why you passed
func
into yoursort()
function for sorting an array of string ?– KolaCaine
Dec 3 at 10:26
4
terminologically it's not
sorting
butshuffling
usingsort
function– sertsedat
Dec 3 at 10:38
1
also please refer to the answer from the question @ponury-kostek linked: stackoverflow.com/a/18650169/3729695
– sertsedat
Dec 3 at 10:42
6
This is a bad idea - the sort predicate should be consistent. If for whatever reason you compare
a
andb
twice, the result should be the same. And in general, it should also consistent. (So a<b and b<c imply a<c, or a>b and b>c imply a>c - the choice of order is independent from the need for consistency)– MSalters
Dec 3 at 11:55
2
"how it really works?" - it doesn't work at all! See also robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
– Bergi
Dec 3 at 12:07