产生0-9之间的不同的随机数,为什么这种循环两次会出现相同的数字呢???求解

program_Three3 2017-11-22 09:06:56

#include <iostream>
using namespace std;
int main(void)
{
for (int h=0;h<3;h++)
{
int a[5], aa[5] = {0}, i, j, k;
for (i = 0;i < 5;i++)
if (aa[i] == 0)
{
a[i] = rand() % 10;
aa[i]++;
}


for (i = 0;i < 5;i++)
cout << a[i] << "," << "\t";
}
cout << endl;

return 0;
}
...全文
737 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
destory27 2017-11-24
  • 打赏
  • 举报
回复
引用 19 楼 destory27 的回复:
计算机随机数并不是所谓正真的随机数,是根据随机数种子产生的看似随机的东西,如果没有修改随机数种子,那产生的数就一样
和上边回答重了
destory27 2017-11-24
  • 打赏
  • 举报
回复
计算机随机数并不是所谓正真的随机数,是根据随机数种子产生的看似随机的东西,如果没有修改随机数种子,那产生的数就一样
ooolinux 2017-11-24
  • 打赏
  • 举报
回复
(伪)随机数的一种实现,mysrand和myrand代码参考VS源代码做了简化:
#include <stdio.h>

unsigned long rand_seed=1;

void mysrand(unsigned int seed)
{
	rand_seed=(unsigned long)seed;
}

int myrand(void)
{  /* rand_seed每次迭代为新的值 */
	return( ((rand_seed = rand_seed * 214013L
            + 2531011L) >> 16) & 0x7fff );
}

int main()
{
	int i;
//	mysrand((unsigned)time(NULL));
	for(i=0;i<10;i++)
		printf("%d\t",myrand()%100);
	return 0;	    
}
自信男孩 2017-11-23
  • 打赏
  • 举报
回复
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(void)
{
        srand(time(NULL));
    for (int h=0;h<3;h++)
    {
        int a[5], aa[5] = {0}, i;
        for (i = 0;i < 5;)
            if (aa[i] == 0)
            {
                a[i] = rand() % 10;
                //cout<<"a[i] = "<< a[i]<<endl;
                aa[i]++;
                i++;    //保证每个都能获取一个随机值
            }


        for (i = 0;i < 5;i++)
            cout << a[i] << "," << "\t";
        cout<<endl;
    }
    cout << endl;

    return 0;
}
若想保证每个数组元素都获得一个随机值,建议将i++放在if判断体内;
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
随机必然有重复,所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面:
#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");
        }
    }
}
program_Three3 2017-11-23
  • 打赏
  • 举报
回复

/* 保证5次结果的每组3个均不同,并且这5次的结果也应该不同*/

#include <iostream>
using namespace std;

void DE(int i)
{
int aa[100],h = 100,m,x,y,j,k,xr[3];

for (k=0;k<5;k++) // 保证5次结果的3组数字都应该不同
{


for (m = 0;m<100;m++)
aa[m] = m;

for (y = i;y< h - 1;y++) // 删除第i个元素,这样数组中就没有i元素,可以保证与xr[0]、xr[1]、xr[2]不重复
aa[y] = aa[y + 1];

h--;

for (x = 0;x <3;x++) //每组3个数组都不应该相同
{
int g = rand() % h;
xr[x] = aa[g];

for (y =aa[g] ;y < h - 1;y++) //删除当前xr[x]元素,保证xr[0]、xr[1]。、xr[2]不相同
aa[y] = aa[y + 1];
h--;

}


for (x = 0;x < 3;x++)
cout << xr[x] << "," << "\t";
cout << endl;

}
}
int main(void)
{
for (int h = 0;h < 1;h++) // 运行3次
DE(2); // 调用函数,保证2与产生的每组随机数不一样
return 0;
}

这样还是不行
CT8100 2017-11-23
  • 打赏
  • 举报
回复
引用 13楼赵4老师 的回复:
[quote=引用 12 楼 iloveyou418 的回复:] 因为计算机不存在真正的随机数,要保证两次出现的不一样需要做srand处理
概念错误!真正的随机是两次出现也有一样的。比如扔硬币这种真正的随机。[/quote]好吧好吧-
ooolinux 2017-11-23
  • 打赏
  • 举报
回复
其实楼主有空可以找到VS安装目录,查看一下rand和srand的源代码,比较明了。
program_Three3 2017-11-23
  • 打赏
  • 举报
回复
如果不使用srand()这个函数,直接通过数组标记。每次运行5次,每次的运行结果都不一样,保证5次中的每组三个数字都应该不同,我想想这样编写还是不对。,请大家看看。

#include <iostream>
using namespace std;

void DE(int i)
{
int aa[100],h = 100,m,x,y,j,k,xr[3];

for (k=0;k<5;k++) // 保证5次结果的3组数字都应该不同
{
for (m = 0;m<100;m++)
aa[m] = m;

for (y = i;y< h - 1;y++)
aa[y] = aa[y + 1];

h--;
for (x = 0;x <3;x++) //每组3个数组都不应该相同
{
int g = rand() % h;
xr[x] = aa[g];

for (y = i;y < h - 1;y++) //剔除 i元素
aa[y] = aa[y + 1];
h--;
}


for (x = 0;x < 3;x++)
cout << xr[x] << "," << "\t";
cout << endl;

}
}
int main(void)
{
for (int h = 0;h < 3;h++) // 运行3次
DE(2); // 调用函数,保证2与产生的每组随机数不一样
return 0;
}



计算结果截图 :
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
引用 12 楼 iloveyou418 的回复:
因为计算机不存在真正的随机数,要保证两次出现的不一样需要做srand处理
概念错误!真正的随机是两次出现也有一样的。比如扔硬币这种真正的随机。
CT8100 2017-11-23
  • 打赏
  • 举报
回复
因为计算机不存在真正的随机数,要保证两次出现的不一样需要做srand处理
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
用例
赵4老师 2017-11-23
  • 打赏
  • 举报
回复
引用 8 楼 u010165006 的回复:
@zhao4zhong1 老赵洗个牌为什么这么复杂?
自带测试用列而已。
ooolinux 2017-11-23
  • 打赏
  • 举报
回复
@program_Three3 如果不用srand((unsigned)time(NULL)); 这条语句该怎么操作 —————— 用GetTickCount来初始化随机数种子应该也可以。
ooolinux 2017-11-23
  • 打赏
  • 举报
回复
@zhao4zhong1 老赵洗个牌为什么这么复杂?
paschen 2017-11-22
  • 打赏
  • 举报
回复
使用rand前需要先调用srand对初始化
program_Three3 2017-11-22
  • 打赏
  • 举报
回复
如果不用srand((unsigned)time(NULL)); 这条语句该怎么操作,
ooolinux 2017-11-22
  • 打赏
  • 举报
回复
srand((unsigned)time(NULL)); //用当前时间初始化随机数种子 参考: C++/C语言rand()和srand()函数产生伪随机数 http://blog.163.com/tab_98/blog/static/11924097201772931815266/
wang0635 2017-11-22
  • 打赏
  • 举报
回复
先调用srand函数

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧