有关随机数的问题
数组如:A[6]={1,2,3,4,5,6};
随机函数:rand()%6;
这样生成的随机数老是有重复和分布完全就有规律的一样,求各位大虾们帮帮忙,相告一下如何改进随机数算法,让随机数更加想随机数。
[解决办法]
利用种子...
srand(time(NULL));
然后跳用rand函数后就不会有你那种情况了 ...试下吧
百度搜下就有的 哦
[解决办法]
什么意思?
随机数当然是会有重复了,不会重复的就不是随机数了。
随机数的分布当然是有规律的,每个数字的分布是均匀的。否则就不是随机数了。
[解决办法]
随机必然有重复!
所谓“不重复的随机”其实是“洗牌”。
“洗牌”算法参考下面:
#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");
}
}
}
[解决办法]
楼上赵老师的算法。。。看的眼都花了。。。srand(time(NULL))。。。
[解决办法]
一切都是幻觉,都是伪随机...
开个玩笑。
如果是Windows平台,用这个吧CryptGenRandom,质量应该高一些。
[解决办法]
2楼正解!!
[解决办法]
srand(time(NULL));
[解决办法]
因为你rand()%6,总共就只有6个不一样的数
你可以把每次生成的数放在一个数组里,然后每次生成了一个数都判断一下数组里有没有这个数,如果有就重新生成,如果没有就表示随机数生成成功

[解决办法]
赵教主这段代码,把底露得彻彻底底啊!
[解决办法]
其实计算机不可能产生随机数,而只是根据一个初始值,按照一定的分布规律生成的一些数,这些数如果数量比较大,则一定满足分布律。
但注意,只要初始值一定,那么最终产生的数的分布情况也是一定的。
所以这个时候就需要设定一个种子数,种子数就是这个初始值,只要让这个种子数时刻在变化,那么就会产生一种伪随机了,虽然不能完全完美,但是已经够用。
使用srand(time(NULL));这个函数就是设定种子数的,按照时间设定种子数,因为时间是时刻变化的。