产生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;
}
...全文
696 20 打赏 收藏 转发到动态 举报
写回复
用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函数
LINGO是用来求解线性和非线性优化问题的简易工具。LINGO内置了一种建立最优化模型的语言,可以简便地表达大规模问题,利用LINGO高效的求解器可快速求解并分析结果。 §1 LINGO快速入门 当你在windows下开始运行LINGO系统时,得到类似下面的一个窗口: 外层是主框架窗口,包含了所有菜单命令和工具条,其它所有的窗口将被包含在主窗口之下。在主窗口内的标题为LINGO Model – LINGO1的窗口是LINGO的默认模型窗口,建立的模型都都要在该窗口内编码实现。下面举两个例子。 例1.1 如何在LINGO中求解如下的LP问题: 在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600; 然后点击工具条上的按钮 即可。 例1.2 使用LINGO软件计算6个发点8个收点的最小费用运输问题。产销单位运价如下表。 单 位 销地 运 价 产地 B1 B2 B3 B4 B5 B6 B7 B8 产量 A1 6 2 6 7 4 2 5 9 60 A2 4 9 5 3 8 5 8 2 55 A3 5 2 1 9 7 4 3 3 51 A4 7 6 7 3 9 2 7 1 43 A5 2 3 9 5 7 2 6 5 41 A6 5 5 2 2 8 1 4 3 52 销量 35 37 22 32 41 32 43 38 使用LINGO软件,编制程序如下: model: !6发点8收点运输问题; sets: warehouses/wh1..wh6/: capacity; vendors/v1..v8/: demand; links(warehouses,vendors): cost, volume; endsets !目标函数; min=@sum(links: cost*volume); !需求约束; @for(vendors(J): @sum(warehouses(I): volume(I,J))=demand(J)); !产量约束; @for(warehouses(I): @sum(vendors(J): volume(I,J))<=capacity(I)); !这里是数据; data: capacity=60 55 51 43 41 52; demand=35 37 22 32 41 32 43 38; cost=6 2 6 7 4 2 9 5 4 9 5 3 8 5 8 2 5 2 1 9 7 4 3 3 7 6 7 3 9 2 7 1 2 3 9 5 7 2 6 5 5 5 2 2 8 1 4 3; enddata end 然后点击工具条上的按钮 即可。 为了能够使用LINGO的强大功能,接着第二节的学习吧。 §2 LINGO中的集 对实际问题建模的时候,总遇到一群或多群相联系的对象,比如工厂、消费者群体、交通工具和雇工等等。LINGO允许把这些相联系的对象聚合成集(sets)。一旦把对象聚合成集,就可以利用集来最大限度的发挥LINGO建模语言的优势。 现在我们将深入介绍如何创建集,并用数据初始化集的属性。学完本节后,你对基于建模技术的集如何引入模型有一个基本的理解。 2.1 为什么使用集 集是LINGO建模语言的基础,是程序设计最强有力的基本构件。借助于集,能够用一个单一的、长的、简明的复合公式表示一系列相似的约束,从而可以快速方便地表达规模较大的模型。 2.2 什么是集 集是一群相联系的对象,这些对象也称为集的成员。一个集可能是一系列产品、卡车或雇员。每个集成员可能有一个或多个与之有关联的特征,我们把这些特征称为属性。属性值可以预先给定,也可以是未知的,有待于LINGO求解。例如,产品集中的每个产品可以有一个价格属性;卡车集中的每辆卡车可以有一个牵引力属性;雇员集中的每位雇员可以有一个薪水属性,也可以有一个生日属性等等。 LINGO有两种类型的集:原始集(primitive set)和派生集(derived set)。 一个原始集是由一些最基本的对象组成的。 一个派生集是用一个或多个其它集来定义的,也就是说,它的成员来自于其它已存在的集。 2.3 模型的集部分 集部分是LINGO模型的一个可选部分。在LINGO模型中使用集之前,必须在集部分事先定义。集部分以关键字“sets:”开始,以“endsets”结束。一个模型可以没有集部分,或有一个简单的集部分,或有多个集部分。一个集部分可以放置于模型的任何地方,但是一个集及其属性
看大小就知道很全啦 查看地址 https://blog.csdn.net/qq_43333395/article/details/98508424 目录: 数据结构: 1.RMQ (区间最值,区间出现最大次数,求区间gcd) 2.二维RMQ求区间最大值 (二维区间极值) 3.线段树模板(模板为区间加法) (线段树染色) (区间最小值) 4.线性基 (求异或第k大) 5.主席树(静态求区间第k小) (区间中小于k的数量和小于k的总和) (区间中第一个大于或等于k的值) 6.权值线段树 (求逆序对) 7.动态主席树 (主席树+树状数组) (区间第k大带修改) 8.树上启发式合并 (查询子树的优化) 9,树状数组模板 (求区间异或和,求逆序对) 扩展 10.区间不重复数字的和 (树状数组) 11.求k维空间中离所给点最近的m个点,并按顺序输出(KD树) 12.LCA (两个节点的公共父节点) 动态规划: 1.LIS (最长上升子序列) 2.有依赖的背包 (附属关系) 3.最长公共子序列(LCS) 4.树形DP 5.状压DP-斯坦纳树 6.背包 7.dp[i]=min(dp[i+1]…dp[i+k]),multset 博弈: 1.NIM博弈 (n堆每次最少取一个) 2.威佐夫博弈(两堆每次取至少一个或一起取一样的) 3.约瑟夫环 4.斐波那契博弈 (取的数依赖于对手刚才取的数) 5.sg函数 数论: 1.数论 素数检验:普通素数判别 线性筛 二次筛法求素数 米勒拉宾素数检验 2.拉格朗日乘子法(求有等式约束条件的极值) 3.裂项(多项式分子分母拆分) 4.扩展欧几里得 (ax+by=c) 5.勾股数 (直角三角形三边长) 6.斯特林公式 (n越大越准确,求n!) 7.牛顿迭代法 (求一元多次方程一个解) 8.同余定理 (a≡b(mod m)) 9.线性求所有逆元的方法求 (1~p modp的逆元) 10.中国剩余定理(n个同余方程x≡a1(modp1)) 11.二次剩余((ax+k)2≡n(modp)(ax+k)^2≡n(mod p)(ax+k) 2 ≡n(modp)) 12.十进制矩阵快速幂(n很大很大的时候) 13.欧拉函数 14.费马小定理 15.二阶常系数递推关系求解方法 (a_n=p*a_{n-1}+q*a_{n-2}) 16.高斯消元 17.矩阵快速幂 18.分解质因数 19.线性递推式BM(杜教) 20.线性一次方程组解的情况 21.求解行列式的逆矩阵,伴随矩阵,矩阵不全随机数不全 组合数学: 1.循环排列 (与环有关的排列组合) 计算几何: 1.三角形 (求面积)) 2.多边形 3.三点求圆心和半径 4.扫描线 (矩形覆盖求面积) (矩形覆盖求周长) 5.凸包 (平面上最远点对) 6.求凸多边形的直径 7.求凸多边形的宽度 8.求凸多边形的最小面积外接矩形 9.半平面交 图论: 基础:前向星 1.最短路(优先队列dijkstra) 2.判断环(tarjan算法) 3.最小生成树(Kruskal 模板) 4.最小生成树(Prim) 5.Dicnic最大流(最小割) 6.无向图最小环(floyd) 7.floyd算法的动态规划(通过部分指定边的最短路) 8.图中找出两点间的最长距离 9.最短路 (spfa) 10.第k短路 (spfa+A*) 11.回文树模板 12.拓扑排序 (模板) 13.次小生成树 14.最小树形图(有向最小生成树) 15.并查集 (普通并查集,带权并查集,) 16.求两个节点的最近公共祖先 (LCA) 17.限制顶点度数的MST(k度限制生成树) 18.多源最短路(spfa,floyd) 19.最短路 (输出字典序最小) 20.最长路 图论题目简述 字符串: 1.字典树(多个字符串的前缀) 2.KMP(关键字搜索) 3.EXKMP(找到S中所有P的匹配) 4.马拉车(最长回文串) 5.寻找两个字符串的最长前后缀(KMP) 6.hash(进制hash,无错hash,多重hash,双hash) 7.后缀数组 (按字典序排字符串后缀) 8.前缀循环节(KMP的fail函数) 9.AC自动机 (n个kmp) 10.后缀自动机 小技巧: 1.关于int,double强转为string 2.输入输出挂 3.低精度加减乘除 4.一些组合数学公式 5.二维坐标的离散化 6.消除向下取整的方法 7.一些常用的数据结构 (STL) 8.Devc++的使用技巧 9.封装好的一维离散化 10.Ubuntu对拍程序 11.常数 12.Codeblocks使用技巧 13.java大数 叮嘱 共173页

69,370

社区成员

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

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