Performing fisher - yates shuffle directly in a 2D array
I have been trying, with no success, to perform a partial fisher-yates shuffle directly for the first N elements of a 2D array. I know I could transform the 2D array into a 1D array, perform the shuffle and then turn it back, but if possible I would like to avoid this.
The problem in my implementation is, I think although I have not proved it, that the last elements of each row of my array are not correctly shuffled. In fact, supposingI have a m*n
array,of which the first N
are equal to 1 and the rest m*n - N
are equal to 0. When I perform my shuffle of the first N
elements of the array, about 67% of the time the elements at the end of each row: array[i][end]
are equal to 1, which seems to me to be too many times.
Here is my implementation along with a driver code that can be run to show what the problem is:
void swap(int **a, int i, int j, int iNew, int jNew)
{
int temp = a[i][j];
a[i][j] = a[iNew][jNew];
a[iNew][jNew] = temp;
}
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < nbLines; i++)
{
for (int j = 0; j < nbColumns; j++)
{
swap(a, i, j, i+rand()%(nbLines-i), j+rand()%(nbColumns -j)); // swap element with random later element
n--;
if(n<=0)
break;
}
if(n<=0)
break;
}
}
int main(int argc, char const *argv)
{
int count1 = 0, count2 = 0, count3 = 0, count4 = 0, N = 10, k = 100000;
srand(time(NULL));
//Short example of a 5 by 5 array, with N = 10 first elements equal to 1
//that need to to be shuffled among all of its elements.
while(k > 0)
{
//allocate
N = 10;
int **a = (int**)malloc(sizeof(int*) * 5);
for(int i = 0; i < 5; i++)
a[i] = (int*)malloc(sizeof(int) * 5);
//initialize
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(N > 0)
a[i][j] = 1;
else
a[i][j] = 0;
N--;
}
}
//shuffle
fisher_yates_shuffle(10, 5, 5, a);
//count how many times the last element of each row is equal to 1.
if(a[1][4] == 1)
count1++;
if(a[2][4] == 1)
count2++;
if(a[3][4] == 1)
count3++;
if(a[4][4] == 1)
count4++;
//destroy memory allocated.
for(int i = 0; i < 5; i++)
free(a[i]);
free(a);
k--;
}
//print approximate results.
printf("%d %d %d %dn", (count1 * 100)/100000, (count2 * 100)/100000, (count3 * 100)/100000, (count4 * 100/100000));
return 0;
}
I know it doesn't look very good and there must be a more efficient way of doing it. Maybe there is a different, equally efficient algorithm to shuffle the first N elements of a 2D array like that?
c arrays algorithm random shuffle
|
show 8 more comments
I have been trying, with no success, to perform a partial fisher-yates shuffle directly for the first N elements of a 2D array. I know I could transform the 2D array into a 1D array, perform the shuffle and then turn it back, but if possible I would like to avoid this.
The problem in my implementation is, I think although I have not proved it, that the last elements of each row of my array are not correctly shuffled. In fact, supposingI have a m*n
array,of which the first N
are equal to 1 and the rest m*n - N
are equal to 0. When I perform my shuffle of the first N
elements of the array, about 67% of the time the elements at the end of each row: array[i][end]
are equal to 1, which seems to me to be too many times.
Here is my implementation along with a driver code that can be run to show what the problem is:
void swap(int **a, int i, int j, int iNew, int jNew)
{
int temp = a[i][j];
a[i][j] = a[iNew][jNew];
a[iNew][jNew] = temp;
}
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < nbLines; i++)
{
for (int j = 0; j < nbColumns; j++)
{
swap(a, i, j, i+rand()%(nbLines-i), j+rand()%(nbColumns -j)); // swap element with random later element
n--;
if(n<=0)
break;
}
if(n<=0)
break;
}
}
int main(int argc, char const *argv)
{
int count1 = 0, count2 = 0, count3 = 0, count4 = 0, N = 10, k = 100000;
srand(time(NULL));
//Short example of a 5 by 5 array, with N = 10 first elements equal to 1
//that need to to be shuffled among all of its elements.
while(k > 0)
{
//allocate
N = 10;
int **a = (int**)malloc(sizeof(int*) * 5);
for(int i = 0; i < 5; i++)
a[i] = (int*)malloc(sizeof(int) * 5);
//initialize
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(N > 0)
a[i][j] = 1;
else
a[i][j] = 0;
N--;
}
}
//shuffle
fisher_yates_shuffle(10, 5, 5, a);
//count how many times the last element of each row is equal to 1.
if(a[1][4] == 1)
count1++;
if(a[2][4] == 1)
count2++;
if(a[3][4] == 1)
count3++;
if(a[4][4] == 1)
count4++;
//destroy memory allocated.
for(int i = 0; i < 5; i++)
free(a[i]);
free(a);
k--;
}
//print approximate results.
printf("%d %d %d %dn", (count1 * 100)/100000, (count2 * 100)/100000, (count3 * 100)/100000, (count4 * 100/100000));
return 0;
}
I know it doesn't look very good and there must be a more efficient way of doing it. Maybe there is a different, equally efficient algorithm to shuffle the first N elements of a 2D array like that?
c arrays algorithm random shuffle
2
Apparentlya
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what theswap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.
– user3386109
Nov 15 '18 at 23:34
1
Role ofint n
unclear. I'd expectn
to be reset eachfor (int i = 0; i < nbLines; i++)
iteration.
– chux
Nov 15 '18 at 23:45
2
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly usedsrand
, somewhere in your code?
– Bob__
Nov 15 '18 at 23:48
1
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from<random>
header, but for C instead for C++.
– Dialecticus
Nov 15 '18 at 23:50
1
@Dialecticus Given that the number of lines is 5 and thatRAND_MAX
is likely something like2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.
– Andrew Henle
Nov 16 '18 at 0:06
|
show 8 more comments
I have been trying, with no success, to perform a partial fisher-yates shuffle directly for the first N elements of a 2D array. I know I could transform the 2D array into a 1D array, perform the shuffle and then turn it back, but if possible I would like to avoid this.
The problem in my implementation is, I think although I have not proved it, that the last elements of each row of my array are not correctly shuffled. In fact, supposingI have a m*n
array,of which the first N
are equal to 1 and the rest m*n - N
are equal to 0. When I perform my shuffle of the first N
elements of the array, about 67% of the time the elements at the end of each row: array[i][end]
are equal to 1, which seems to me to be too many times.
Here is my implementation along with a driver code that can be run to show what the problem is:
void swap(int **a, int i, int j, int iNew, int jNew)
{
int temp = a[i][j];
a[i][j] = a[iNew][jNew];
a[iNew][jNew] = temp;
}
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < nbLines; i++)
{
for (int j = 0; j < nbColumns; j++)
{
swap(a, i, j, i+rand()%(nbLines-i), j+rand()%(nbColumns -j)); // swap element with random later element
n--;
if(n<=0)
break;
}
if(n<=0)
break;
}
}
int main(int argc, char const *argv)
{
int count1 = 0, count2 = 0, count3 = 0, count4 = 0, N = 10, k = 100000;
srand(time(NULL));
//Short example of a 5 by 5 array, with N = 10 first elements equal to 1
//that need to to be shuffled among all of its elements.
while(k > 0)
{
//allocate
N = 10;
int **a = (int**)malloc(sizeof(int*) * 5);
for(int i = 0; i < 5; i++)
a[i] = (int*)malloc(sizeof(int) * 5);
//initialize
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(N > 0)
a[i][j] = 1;
else
a[i][j] = 0;
N--;
}
}
//shuffle
fisher_yates_shuffle(10, 5, 5, a);
//count how many times the last element of each row is equal to 1.
if(a[1][4] == 1)
count1++;
if(a[2][4] == 1)
count2++;
if(a[3][4] == 1)
count3++;
if(a[4][4] == 1)
count4++;
//destroy memory allocated.
for(int i = 0; i < 5; i++)
free(a[i]);
free(a);
k--;
}
//print approximate results.
printf("%d %d %d %dn", (count1 * 100)/100000, (count2 * 100)/100000, (count3 * 100)/100000, (count4 * 100/100000));
return 0;
}
I know it doesn't look very good and there must be a more efficient way of doing it. Maybe there is a different, equally efficient algorithm to shuffle the first N elements of a 2D array like that?
c arrays algorithm random shuffle
I have been trying, with no success, to perform a partial fisher-yates shuffle directly for the first N elements of a 2D array. I know I could transform the 2D array into a 1D array, perform the shuffle and then turn it back, but if possible I would like to avoid this.
The problem in my implementation is, I think although I have not proved it, that the last elements of each row of my array are not correctly shuffled. In fact, supposingI have a m*n
array,of which the first N
are equal to 1 and the rest m*n - N
are equal to 0. When I perform my shuffle of the first N
elements of the array, about 67% of the time the elements at the end of each row: array[i][end]
are equal to 1, which seems to me to be too many times.
Here is my implementation along with a driver code that can be run to show what the problem is:
void swap(int **a, int i, int j, int iNew, int jNew)
{
int temp = a[i][j];
a[i][j] = a[iNew][jNew];
a[iNew][jNew] = temp;
}
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < nbLines; i++)
{
for (int j = 0; j < nbColumns; j++)
{
swap(a, i, j, i+rand()%(nbLines-i), j+rand()%(nbColumns -j)); // swap element with random later element
n--;
if(n<=0)
break;
}
if(n<=0)
break;
}
}
int main(int argc, char const *argv)
{
int count1 = 0, count2 = 0, count3 = 0, count4 = 0, N = 10, k = 100000;
srand(time(NULL));
//Short example of a 5 by 5 array, with N = 10 first elements equal to 1
//that need to to be shuffled among all of its elements.
while(k > 0)
{
//allocate
N = 10;
int **a = (int**)malloc(sizeof(int*) * 5);
for(int i = 0; i < 5; i++)
a[i] = (int*)malloc(sizeof(int) * 5);
//initialize
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(N > 0)
a[i][j] = 1;
else
a[i][j] = 0;
N--;
}
}
//shuffle
fisher_yates_shuffle(10, 5, 5, a);
//count how many times the last element of each row is equal to 1.
if(a[1][4] == 1)
count1++;
if(a[2][4] == 1)
count2++;
if(a[3][4] == 1)
count3++;
if(a[4][4] == 1)
count4++;
//destroy memory allocated.
for(int i = 0; i < 5; i++)
free(a[i]);
free(a);
k--;
}
//print approximate results.
printf("%d %d %d %dn", (count1 * 100)/100000, (count2 * 100)/100000, (count3 * 100)/100000, (count4 * 100/100000));
return 0;
}
I know it doesn't look very good and there must be a more efficient way of doing it. Maybe there is a different, equally efficient algorithm to shuffle the first N elements of a 2D array like that?
c arrays algorithm random shuffle
c arrays algorithm random shuffle
edited Nov 16 '18 at 0:47
Desperados
asked Nov 15 '18 at 23:25
DesperadosDesperados
565
565
2
Apparentlya
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what theswap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.
– user3386109
Nov 15 '18 at 23:34
1
Role ofint n
unclear. I'd expectn
to be reset eachfor (int i = 0; i < nbLines; i++)
iteration.
– chux
Nov 15 '18 at 23:45
2
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly usedsrand
, somewhere in your code?
– Bob__
Nov 15 '18 at 23:48
1
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from<random>
header, but for C instead for C++.
– Dialecticus
Nov 15 '18 at 23:50
1
@Dialecticus Given that the number of lines is 5 and thatRAND_MAX
is likely something like2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.
– Andrew Henle
Nov 16 '18 at 0:06
|
show 8 more comments
2
Apparentlya
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what theswap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.
– user3386109
Nov 15 '18 at 23:34
1
Role ofint n
unclear. I'd expectn
to be reset eachfor (int i = 0; i < nbLines; i++)
iteration.
– chux
Nov 15 '18 at 23:45
2
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly usedsrand
, somewhere in your code?
– Bob__
Nov 15 '18 at 23:48
1
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from<random>
header, but for C instead for C++.
– Dialecticus
Nov 15 '18 at 23:50
1
@Dialecticus Given that the number of lines is 5 and thatRAND_MAX
is likely something like2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.
– Andrew Henle
Nov 16 '18 at 0:06
2
2
Apparently
a
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what the swap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.– user3386109
Nov 15 '18 at 23:34
Apparently
a
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what the swap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.– user3386109
Nov 15 '18 at 23:34
1
1
Role of
int n
unclear. I'd expect n
to be reset each for (int i = 0; i < nbLines; i++)
iteration.– chux
Nov 15 '18 at 23:45
Role of
int n
unclear. I'd expect n
to be reset each for (int i = 0; i < nbLines; i++)
iteration.– chux
Nov 15 '18 at 23:45
2
2
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly used
srand
, somewhere in your code?– Bob__
Nov 15 '18 at 23:48
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly used
srand
, somewhere in your code?– Bob__
Nov 15 '18 at 23:48
1
1
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from
<random>
header, but for C instead for C++.– Dialecticus
Nov 15 '18 at 23:50
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from
<random>
header, but for C instead for C++.– Dialecticus
Nov 15 '18 at 23:50
1
1
@Dialecticus Given that the number of lines is 5 and that
RAND_MAX
is likely something like 2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.– Andrew Henle
Nov 16 '18 at 0:06
@Dialecticus Given that the number of lines is 5 and that
RAND_MAX
is likely something like 2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.– Andrew Henle
Nov 16 '18 at 0:06
|
show 8 more comments
1 Answer
1
active
oldest
votes
Expanding my previous comment, you could shuffle your "array" in a single loop:
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < n; i++)
{
int j = i + rand() % (nbLines * nbColumns - i);
swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns);
}
}
Note that there are far better ways to implement and pass around a matrix in C and that your swap function should return void
, not int
.
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
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',
autoActivateHeartbeat: false,
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%2f53329280%2fperforming-fisher-yates-shuffle-directly-in-a-2d-array%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Expanding my previous comment, you could shuffle your "array" in a single loop:
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < n; i++)
{
int j = i + rand() % (nbLines * nbColumns - i);
swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns);
}
}
Note that there are far better ways to implement and pass around a matrix in C and that your swap function should return void
, not int
.
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
add a comment |
Expanding my previous comment, you could shuffle your "array" in a single loop:
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < n; i++)
{
int j = i + rand() % (nbLines * nbColumns - i);
swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns);
}
}
Note that there are far better ways to implement and pass around a matrix in C and that your swap function should return void
, not int
.
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
add a comment |
Expanding my previous comment, you could shuffle your "array" in a single loop:
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < n; i++)
{
int j = i + rand() % (nbLines * nbColumns - i);
swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns);
}
}
Note that there are far better ways to implement and pass around a matrix in C and that your swap function should return void
, not int
.
Expanding my previous comment, you could shuffle your "array" in a single loop:
void fisher_yates_shuffle(int n, int nbLines, int nbColumns, int **a)
{
for (int i = 0; i < n; i++)
{
int j = i + rand() % (nbLines * nbColumns - i);
swap(a, i / nbColumns, i % nbColumns, j / nbColumns, j % nbColumns);
}
}
Note that there are far better ways to implement and pass around a matrix in C and that your swap function should return void
, not int
.
edited Nov 21 '18 at 7:10
answered Nov 16 '18 at 0:36
Bob__Bob__
5,11331527
5,11331527
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
add a comment |
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
This works perfectly, random positions get values of 1 with more or less the same probability. My "array" shuffle works now, thanks. I would also appreciate it if you could explain in more detail your comment about how I could pass my matrix into my function more efficiently
– Desperados
Nov 16 '18 at 0:46
2
2
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
@Desperados See e.g. stackoverflow.com/questions/42094465/… It's a long Q&A, but it's worth reading.
– Bob__
Nov 16 '18 at 0:49
1
1
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
I think indexes (i and j) have to be divides by nbColumns so that the algorithm may be applicable to 'arrays' that are not square (n by n). I think my observation is correct, maybe you want to consider editing your answer or explaining to me if I am wrong.
– Desperados
Nov 21 '18 at 4:45
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
@Desperados Yes, you are correct. Good catch, thanks.
– Bob__
Nov 21 '18 at 7:12
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.
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%2f53329280%2fperforming-fisher-yates-shuffle-directly-in-a-2d-array%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
2
Apparently
a
is an array of pointers, but you should clarify that by editing the question. Also, it would help to see what theswap
function does. In summary, this question needs a Minimal, Complete, and Verifiable example.– user3386109
Nov 15 '18 at 23:34
1
Role of
int n
unclear. I'd expectn
to be reset eachfor (int i = 0; i < nbLines; i++)
iteration.– chux
Nov 15 '18 at 23:45
2
Given the implementation in your snippet, you could just use a plain array of n*m elements. BTW, have you properly used
srand
, somewhere in your code?– Bob__
Nov 15 '18 at 23:48
1
Instead of rand(), which produces randoms in range 0..RAND_MAX, and modulo operator, which does not provide even distribution, you should use better random function and better distribution, like those from
<random>
header, but for C instead for C++.– Dialecticus
Nov 15 '18 at 23:50
1
@Dialecticus Given that the number of lines is 5 and that
RAND_MAX
is likely something like2147483647
, I'd bet quite a sum that the modulo operator doesn't introduce any measurable problems with the distribution.– Andrew Henle
Nov 16 '18 at 0:06