关于随机数...向你请教... to In355Hz panda_w斑竹: 愿你们能解答我的问题... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 什么是互相独立? 我只是有一个数组, 如a[15] 你给它赋值,不能重复,可能:a[0] =0 ;a[1] = 14, a[2] = 9... to ggyy: 你有更好的方法吗? 相互独立就是哥哥元素不相干!B[N]={1,...N-1};int n=rand()%N;int m=rand()%N;A[m]=B[n];for(int i=0,i<m;i++) A[i]=B[n+i];for(i=m;i<N;i++)A[i]=B[i-m];可以吗? B[N]={1,...N-1};是B[N]={0,...N-1}; for(i=m;i<N;i++)A[i]=B[i-m];是if(m+1<N){for(i=m+1;i<N;i++)A[i]=B[i-m-1];} for(int i=0,i<m;i++) A[i]=B[n+i];是:for(int i=0,i<m;i++) A[i]=B[n+i+1];不好意思!老是高错下标!!!! 你用了rand(),这就可以解决问题吗?不知道效率怎么样? to ggyy: 我大概能明白你的意思,好像只要产生一个随机数n,数组里其它的值也都改变了,是不是随机得不够,不知道我看懂你的代码没有?to fxxxf: 能够详细一些吗? 我有点笨...我这一切,只是为了模仿扫地雷的游戏... 可以这样:1.首先创建一个动态数组b[N],其中b[n]=n;2.然后生成一个0到N-1间的随机数m,赋值a[0]=b[m];3.把b[m]这个元素删掉(动态数组嘛),现在数组b只有N-1个元素了。4.重复以上过程依次给a数组各元素赋值就可以了。 其实就是顺序给数组赋值,再随机的打乱数据顺序。只是打乱方法可以变变:int a[N];int b,c;for(j=0; j<打乱次数; j) { for(i=0;i<N;i++) { b = rand()%N; c = a[i]; a[i] = a[b]; a[b] = c; }}如果一次不够乱,可以多打几次。时间复杂度(打乱次数*N)应该比你的方法(至少是N^2/2)快。 有点错,再重贴一遍:int a[N] = {0,1,...,N-1};int b,c;for(j=0; j<打乱次数; j) { for(i=0;i<N;i++) { b = rand()%N; c = a[i]; a[i] = a[b]; a[b] = c; }} 是在发牌吧,我想就是在剩余的牌中随机抽出一张牌。直到抽完。int N=10;int *a=new int[N];int ai=0;CArray<int,int> b;for(int i=0;i<N;i++){ b.Add(i);}srand(time(NULL));while(b.GetSize()){ int n=rand()%N--; a[ai++]=b[n]; b.RemoveAt(n); }以上代码我试了一下。速度不成问题。 In355Hz(好象一条狗):你的算法虽然增加的次数,但还是rand函数的伪随机数,不能改善随机效果。真正的随机数有几种方式实现:1、找一个大的文件,然后用des处理,然后read word, 读出的序列是真正的随机数2、用SYSTEMTIME的millionSeconds每天生成一个序列,然后对rand产生的数组进行两两交换[email protected] 产生一列个数等于N的随即数列,用快速排序法给这数列排序,然后按顺序把数列中每一个元素在这排序中的名次作为它的内容,如:若a[i]是第y名,那么我们就使a[i]=y我想这应该是很直观的算法了 to tipbridge(asd) :与你探讨“真正的”随机数的问题。我们用的计算机,都无法产生真正的随机数,这是由硬件特性决定的。第一个例子,只要文件相同,最后得到的结果是一样的。第二个例子,非但精度有限,而且,每天只能得到一个随机数?产生真正的随机数是很麻烦的。比如,比较“牛”的是,通过监测原子核衰变放出的粒子数来产生随机数。至少,我们认为弱相互作用是随机的,不受任何外界因素制约。还比如,利用温度等物理量,转换方法之后得到随机数,但随机性能就不如上面那种了。有的ic卡中是这么做的。 谁有《深入浅出MFC》简体版? mfc 多语言 AFX_TARG_ENU 简单 菜鸟提问 VC问题求助! 初用VC Socket编程 问下程序怎么单机调试?30分 ATL难题? 拜谢. 请教一个StreamIn的问题??? ocx最基本的问题,麻烦各位帮帮忙? MFC中 List Box 选中项取消的问题 HELP:怎么获得分辨率 如何没有闪烁的移动线条 初学者可以先学习VC++吗? VC6.0显示的奇怪问题?
我只是有一个数组, 如a[15] 你给它赋值,不能重复,可能:a[0] =0 ;
a[1] = 14, a[2] = 9...
你有更好的方法吗?
B[N]={1,...N-1};
int n=rand()%N;
int m=rand()%N;
A[m]=B[n];
for(int i=0,i<m;i++)
A[i]=B[n+i];for(i=m;i<N;i++)
A[i]=B[i-m];
可以吗?
是
B[N]={0,...N-1};
A[i]=B[i-m];
是
if(m+1<N)
{
for(i=m+1;i<N;i++)
A[i]=B[i-m-1];
}
A[i]=B[n+i];是:
for(int i=0,i<m;i++)
A[i]=B[n+i+1];
不好意思!
老是高错下标!!!!
我大概能明白你的意思,好像只要产生一个随机数n,数组里其它的值也都改变了,是不是随机得不够,不知道我看懂你的代码没有?
to fxxxf:
能够详细一些吗? 我有点笨...
我这一切,只是为了模仿扫地雷的游戏...
1.首先创建一个动态数组b[N],其中b[n]=n;
2.然后生成一个0到N-1间的随机数m,赋值a[0]=b[m];
3.把b[m]这个元素删掉(动态数组嘛),现在数组b只有N-1个元素了。
4.重复以上过程依次给a数组各元素赋值就可以了。
只是打乱方法可以变变:
int a[N];
int b,c;
for(j=0; j<打乱次数; j) {
for(i=0;i<N;i++) {
b = rand()%N;
c = a[i];
a[i] = a[b];
a[b] = c;
}
}
如果一次不够乱,可以多打几次。时间复杂度(打乱次数*N)应该比你的方法(至少是N^2/2)快。
int a[N] = {0,1,...,N-1};
int b,c;
for(j=0; j<打乱次数; j) {
for(i=0;i<N;i++) {
b = rand()%N;
c = a[i];
a[i] = a[b];
a[b] = c;
}
}
int *a=new int[N];
int ai=0;
CArray<int,int> b;
for(int i=0;i<N;i++){
b.Add(i);
}
srand(time(NULL));
while(b.GetSize()){
int n=rand()%N--;
a[ai++]=b[n];
b.RemoveAt(n);
}
以上代码我试了一下。速度不成问题。
你的算法虽然增加的次数,但还是rand函数的伪随机数,不能改善随机效果。真正的随机数有几种方式实现:
1、找一个大的文件,然后用des处理,然后read word, 读出的序列是真正的随机数
2、用SYSTEMTIME的millionSeconds每天生成一个序列,然后对rand产生的数组进行两两交换[email protected]
与你探讨“真正的”随机数的问题。
我们用的计算机,都无法产生真正的随机数,这是由硬件特性决定的。
第一个例子,只要文件相同,最后得到的结果是一样的。
第二个例子,非但精度有限,而且,每天只能得到一个随机数?
产生真正的随机数是很麻烦的。
比如,比较“牛”的是,通过监测原子核衰变放出的粒子数来产生随机数。至少,我们认为弱相互作用是随机的,不受任何外界因素制约。
还比如,利用温度等物理量,转换方法之后得到随机数,但随机性能就不如上面那种了。有的ic卡中是这么做的。