user-0 提问: 随机化数组算法

回复:
user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:仅供参考#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }    谢谢赵老师，赵老师辛苦了，还是代码给力。能加点分析就完美了O(∩_∩)O~

user: user-1
content: 引用 11 楼 jiandingzhe 的回复:另外，C++标准库里好像有shuffle吧？你可以看看它是怎么做的。 ++  C++ 标准库确实有洗牌算法，shuffle

user: user-2
content: 引用 6 楼 shangyu0801 的回复:[quote=引用 5 楼 taodm 的回复:] 写正确一个随机算法是需要极好的数学基础的，因为你得证明随机性。 还是把精力放在其它更有价值的东西上吧。 其实我只是想随机化一个数组，最重要的是我觉得，是思考本身，而不是思考什么问题。 本例中那个for+while(1)的用法，让我很难受，但是实在想不到好的方法。[/quote] 做一个sort，让sort的依据是随机的。 另外，C++标准库里好像有shuffle吧？你可以看看它是怎么做的。

user: user-0
content: 引用 9 楼 starytx 的回复:循环一遍，将第i个和随机出来的位置的元素交换不行吗？ 恩，这样也行。等下班了，试试这样。呵呵

user: user-3
content: 循环一遍，将第i个和随机出来的位置的元素交换不行吗？

user: user-0
content: 引用 7 楼 netbooting 的回复:随机化数组下标是神马意思？？将数组元素随机排列？ 恩

user: user-4
content: 随机化数组下标是神马意思？？将数组元素随机排列？

user: user-5
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

user: user-0
content: 引用 5 楼 taodm 的回复:写正确一个随机算法是需要极好的数学基础的，因为你得证明随机性。 还是把精力放在其它更有价值的东西上吧。 其实我只是想随机化一个数组，最重要的是我觉得，是思考本身，而不是思考什么问题。 本例中那个for+while(1)的用法，让我很难受，但是实在想不到好的方法。

user: user-6
content: 写正确一个随机算法是需要极好的数学基础的，因为你得证明随机性。 还是把精力放在其它更有价值的东西上吧。

user: user-0
content: 引用 2 楼 taodm 的回复:stl里randomXX函数现成的啊。楼主是根本不会偷懒啊，因为库不熟啊。 嗯，主要是对库不熟悉，呵呵。不过这些还是想自己动手写写玩O(∩_∩)O~

user: user-0
content: 引用 1 楼 caozhy 的回复:随机洗牌？  最简单的思路就是用随机数作为条件，给数组排序。 怎样用随机数作为条件呢？给数组按照什么排序啊？请指教

user: user-6
content: stl里randomXX函数现成的啊。楼主是根本不会偷懒啊，因为库不熟啊。

user: user-7
content: 随机洗牌？  最简单的思路就是用随机数作为条件，给数组排序。