469,274 Members | 1,833 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,274 developers. It's quick & easy.

Shuffle array elements (3 to end of array) in random order

I'd like to reorganize the third, fourth, fifth and sixth, as well as any
elements thereafter in an array in random order:

var a = new Array('first','second','third','fourth','fifth','s ixth','etc')

In other words, the first, second and third element should remain in
position 0, 1 and 2, while the fourth, fifth and sixth, etc. should appear
in random order.

Can anyone recommend a method to do this?

May 6 '07 #1
9 5117
Lee
Tuxedo said:
>
I'd like to reorganize the third, fourth, fifth and sixth, as well as any
elements thereafter in an array in random order:

var a = new Array('first','second','third','fourth','fifth','s ixth','etc')

In other words, the first, second and third element should remain in
position 0, 1 and 2, while the fourth, fifth and sixth, etc. should appear
in random order.

Can anyone recommend a method to do this?
First you need to describe what you want in a way that isn't
self-contradictory. Then you should read this newsgroup's FAQ,
particularly the note box in this section:
http://www.jibbering.com/faq/#FAQ4_22
--

May 6 '07 #2
Lee wrote:

[...]
First you need to describe what you want in a way that isn't
self-contradictory. Then you should read this newsgroup's FAQ,
particularly the note box in this section:
http://www.jibbering.com/faq/#FAQ4_22
Thank you for pointing me to that specific FAQ including those noteboxes
with links to some pretty complex math!! I hope the answer hides somewhere
in there....

In which way do you mean my description is self-contradictory?

To be more precise, after reorgnizing the latter part of the array, i.e.
starting from 3 index, the intended result, or the properties of the new
array, could be for example:

'first','second','third','fourth','fifth','sixth', 'etc'
or
'first','second','third','fifth','fourth','sixth', 'etc'
or
'first','second','third','sixth','fifth','fourth', 'etc')
or
'first','second','third','etc','fourth','sixth','f ifth'
etc.

The first 3 elements should remain in the position of the original array,
while the remaining elements should be simply reshuffled in a random order,
appearinging only once in any one position.

What is best here? Would it be to create an array without the first 3
elements and then add them into a randomly generated array of specified
elements?
May 6 '07 #3
Tuxedo said the following on 5/6/2007 10:46 AM:
Lee wrote:

[...]
>First you need to describe what you want in a way that isn't
self-contradictory. Then you should read this newsgroup's FAQ,
particularly the note box in this section:
http://www.jibbering.com/faq/#FAQ4_22

Thank you for pointing me to that specific FAQ including those noteboxes
with links to some pretty complex math!! I hope the answer hides somewhere
in there....

In which way do you mean my description is self-contradictory?
"I want my array in random order but I want to control what is or is not
random" is self-contradictory.

<snip>
The first 3 elements should remain in the position of the original array,
while the remaining elements should be simply reshuffled in a random order,
appearinging only once in any one position.

What is best here? Would it be to create an array without the first 3
elements and then add them into a randomly generated array of specified
elements?
Yes.

--
Randy
Chance Favors The Prepared Mind
comp.lang.javascript FAQ - http://jibbering.com/faq/index.html
Javascript Best Practices - http://www.JavascriptToolbox.com/bestpractices/
May 6 '07 #4
Randy Webb wrote:

[...]
"I want my array in random order but I want to control what is or is not
random" is self-contradictory.
That was not exactly what I meant, but what I did mean was for some but not
all elements of an array to be reorganized in random order. But I think you
understood by now that I was not referring to the entire array as such.
Yes.
Thanks for the tip, which by the sound of it, I guess must be easier than
randomly reorganise only a specified segment of the complete array.

My question is therefore reduced and simplified to: How can I randomly
reorganise the elements of the following array?

var a = new Array('fourth','fifth','sixth','etc')

May 6 '07 #5
Tuxedo wrote:
Thanks for the tip, which by the sound of it, I guess must be easier than
randomly reorganise only a specified segment of the complete array.
To answer myself, with some extra help from about.com
(http://javascript.about.com/library/blsort2.htm) the following solution
appears to work just fine:

function randOrd(){
return (Math.round(Math.random())-0.5);
}

var a = new Array('fourth','fifth','sixth','etc')
a.sort(randOrd)
a.unshift('first','second','third')
May 6 '07 #6
Lee
Tuxedo said:
>
Lee wrote:

[...]
>First you need to describe what you want in a way that isn't
self-contradictory. Then you should read this newsgroup's FAQ,
particularly the note box in this section:
http://www.jibbering.com/faq/#FAQ4_22

Thank you for pointing me to that specific FAQ including those noteboxes
with links to some pretty complex math!! I hope the answer hides somewhere
in there....

In which way do you mean my description is self-contradictory?
You said:

I'd like to reorganize the third, fourth, ...

In other words, the first, second and third element should remain ...

The "third" element appears both in the list to be reorganized and
in the list to remain in place.

Look through those links for references to shuffling. You'll find
code that you can copy and paste. Once you're familiar with it,
you can decide whether to modify it slightly to begin at the third
(or is it fourth?) position, or whether you want to split it before
you shuffle and rejoin afterwards.
--

May 6 '07 #7
Lee wrote:

[..]
In other words, the first, second and third element should remain ...
Yes. Maybe there was some confusion with regards to my definition of the
starting point.

[..]
Look through those links for references to shuffling. You'll find
code that you can copy and paste. Once you're familiar with it,
you can decide whether to modify it slightly to begin at the third
(or is it fourth?) position, or whether you want to split it before
you shuffle and rejoin afterwards.
Thank you for the tips!
May 6 '07 #8
In comp.lang.javascript message <f1*************@news.t-online.com>,
Sun, 6 May 2007 18:11:25, Tuxedo <tu****@mailinator.netposted:
>Tuxedo wrote:
>Thanks for the tip, which by the sound of it, I guess must be easier than
randomly reorganise only a specified segment of the complete array.
Possibly easier; but not otherwise better.

>To answer myself, with some extra help from about.com
(http://javascript.about.com/library/blsort2.htm) the following solution
appears to work just fine:

function randOrd(){
return (Math.round(Math.random())-0.5);
}

var a = new Array('fourth','fifth','sixth','etc')
a.sort(randOrd)
a.unshift('first','second','third')
That method was discussed here some years ago, as an example of amusing
but ludicrous programming.

The specification of Array.sort calls for repeatable comparisons; the
sort algorithm to be used is not defined, and may vary from browser to
browser, version to version. With non-repeatable comparison, the result
cannot be guaranteed : the sort algorithm might not even finish in some
systems.

An efficient shuffle of N elements takes time O(N), and uses O(N) calls
of Random. The sort algorithm will take time at least about O(NlogN)
calling Random O(2NlogN) times.
The first question you should consider is whether you actually need a
Shuffle. A Shuffle starts with all the elements present on some order
and ends with them all on an independent order, probably in the same
Array. You might be able to install the first three elements in direct
order, then the rest in random order.

For shuffle-in-place, it would be easier to keep the last three elements
unmoved, by doing a standard shuffle but lying about the length. So,
consider

function Random(X) {
return Math.floor(X*(Math.random()%1)) /* %1 : Opera */ }

function ShuffleX(Q, x) { var R, T, J
for (J=Q.length-1 -x ; J>0 ; J--)
{ R=Random(J+1) ; T=Q[J] ; Q[J]=Q[R] ; Q[R]=T }
return Q }

A = [1,2,3,4,5,6,7,8,9]
A = A.reverse()
ShuffleX(A, 3)
A = A.reverse()

In that, ShuffleX is the FAQ-cited standard (Knuth?) algorithm, modified
by the addition of the parameter x.

Now you can optimise by rewriting ShuffleX so that it works the other
way round, and omit the reversals.

It's a good idea to read the newsgroup c.l.j and its FAQ. See below.

--
(c) John Stockton, Surrey, UK. ?@merlyn.demon.co.uk Turnpike v6.05 IE 6
news:comp.lang.javascript FAQ <URL:http://www.jibbering.com/faq/index.html>.
<URL:http://www.merlyn.demon.co.uk/js-index.htmjscr maths, dates, sources.
<URL:http://www.merlyn.demon.co.uk/TP/BP/Delphi/jscr/&c, FAQ items, links.
May 6 '07 #9
Dr J R Stockton wrote:

[..]
function Random(X) {
return Math.floor(X*(Math.random()%1)) /* %1 : Opera */ }

function ShuffleX(Q, x) { var R, T, J
for (J=Q.length-1 -x ; J>0 ; J--)
{ R=Random(J+1) ; T=Q[J] ; Q[J]=Q[R] ; Q[R]=T }
return Q }

A = [1,2,3,4,5,6,7,8,9]
A = A.reverse()
ShuffleX(A, 3)
A = A.reverse()

In that, ShuffleX is the FAQ-cited standard (Knuth?) algorithm, modified
by the addition of the parameter x.

Now you can optimise by rewriting ShuffleX so that it works the other
way round, and omit the reversals.
Not that I've seen the ludicrous about.com + unshift method fail on any
browser I've tested it on so far, but hey, your solution certainly sound
like the more sophisticated one!! Thanks for the detailed code example!

May 7 '07 #10

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by Frank & Janny Plaza | last post: by
22 posts views Thread by Nhmiller | last post: by
24 posts views Thread by RyanTaylor | last post: by
4 posts views Thread by kevincw01 | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.