**News Alert:**Experts Exchange Confirmed as Safe in Cloudbleed Leak Read More

Solved

Posted on 2000-04-26

int Array[3] = {0,1,2}

I want an algorithm that will shuffle the order of this array randomly, so that the following six combinations are all equally likely:

{0,1,2}

{0,2,1}

(1,0,2}

{1,2,0}

{2,0,1}

{2,1,0}

Tbe following Fischer-Yates shuffle I was using yields only the combinations {2,0,1} and {1,2,0}:

for (int l=1,l<3,l++)

{ int r = random(l);

int temp = Array[l];

Array[l] = Array[r];

Array [r] = temp;

}

I want an algorithm that will shuffle the order of this array randomly, so that the following six combinations are all equally likely:

{0,1,2}

{0,2,1}

(1,0,2}

{1,2,0}

{2,0,1}

{2,1,0}

Tbe following Fischer-Yates shuffle I was using yields only the combinations {2,0,1} and {1,2,0}:

for (int l=1,l<3,l++)

{ int r = random(l);

int temp = Array[l];

Array[l] = Array[r];

Array [r] = temp;

}

2 Comments

Your current code will first swap Array[1] with Array[0] to produce {1,0,2} and then swap Array[2] with either Array[0] or Array[1] to produce either {2,0,1} or {1,2,0}.

Try this instead:

for (int i = 2, i > 0 ,i--)

{

int r = random(i + 1);

int temp = Array[i];

Array[i] = Array[r];

Array[r] = temp;

}

On the first iteration this will produce one of:

{0,1,2} {0,2,1} {2,1,0}

And on the second will produce one of:

{0,1,2} {1,0,2} {0,2,1} {2,0,1} {2,1,0} {1,2,0}

Let me know if my first assumption was wrong and I will fix the algorithm for you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Title | # Comments | Views | Activity |
---|---|---|---|

Handle Exceptions during instantiation | 28 | 417 | |

How to convert MFC::CString to UTF8 wchar_t* | 10 | 216 | |

Best book to learn C++ | 4 | 80 | |

Arduino EDI - Programming language | 3 | 95 |

The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

Join the community of 500,000 technology professionals and ask your questions.