| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2443 人关注过本帖
标题:关于随机数
只看楼主 加入收藏
budong12345
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-6-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:22 
关于随机数
随机数没学过,哪位大神能教教随机产生五位无重复数字的随机函数? 还有原理😂😂
2016-06-07 20:41
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:4 
在[10000,99999]中随机取走一个。
2016-06-07 21:09
budong12345
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-6-7
收藏
得分:0 
无重复数字
2016-06-07 21:31
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
以下是引用budong12345在2016-6-7 21:31:07的发言:

无重复数字

是无重复的,在[10000,99999]中随机取走一个,注意是“取走”不是“取出”。
2016-06-07 23:33
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9024
专家分:54030
注 册:2011-1-18
收藏
得分:4 
是产生一系列不重复的5位随机数
还是产生一个各位不重复的5位随机数

2016-06-08 08:16
budong12345
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-6-7
收藏
得分:0 
回复 4楼 吹水佬
抱歉,没说清楚。是这五位数字各位互不相同
2016-06-10 17:56
budong12345
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-6-7
收藏
得分:0 
回复 5楼 rjsp
是各位互不重复的五位数字。其实这是个猜数游戏,随机给出一个各位互不相同的五位数,让用户去猜,然后给出偏大偏小提示,纪录猜的次数,最后给出评分。然而,开头的随机数不会
2016-06-10 18:04
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
以下是引用budong12345在2016-6-10 17:56:49的发言:

抱歉,没说清楚。是这五位数字各位互不相同

原理一样,变换一下就是:先生成“各位互不相同5位数字”的所有组合,要时随机取走一组,取一次就少一组,这样每次取的都不会出现相同。如果取的次数多,这种方法效率较高。
2016-06-10 21:15
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
收藏
得分:4 
回复 8楼 吹水佬
这样做是不是比较笨?既占空间,也谈不上效率高。
对于在给定范围内抽取不同数的随机数,我一般会采取两种方法:
1、是排队抽走方法,就是将给定的数排好队,抽一个走一个,剩下的肯定和抽取数不同,随机范围逐步缩小,本方法对全随机数比较有效,如将1-100的数打乱。这个方法和吹版主的说法相同又不同,吹版主要生成全部的各位不同5位数,相当于10组5的组合排列,太多,太占空间,相对于本题我觉得不是最优。
2、随机生成各位数逐位比较法,如发现有相同的丢弃,不同则组合。这种方法适合选取的数的个数小于选取范围的随机数,如本题是在0-9共10个数中选取5个数,比较适合本方法,该方法特点是代码量少、算法简单,但有效率低甚至死循环的风险(毕竟有总是选取相同丢弃的概率存在)
按题意,我的代码如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
    int i,t,a[10]={0};
    srand(time(0));
    for(i=0;i<10;i++)a[i]=0;
    for(t=0;t<9876;)
    {
        i=rand()%10;
        if(!a[i]++)t=t*10+i;
    }
    printf("%d\n",t);
}
//if(!a[i]++)t=t*10+i;可能存在不确定执行点的问题,在vs2010中可正常执行,其他编译器可能不正常,分解为以下代码可能好理解些
//if(!a[i])
//{
//    t=t*10+i;
//    a[i]++;
//}


[此贴子已经被作者于2016-6-11 09:09编辑过]


能编个毛线衣吗?
2016-06-11 08:07
budong12345
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2016-6-7
收藏
得分:0 
回复 9楼 wmf2014
图片附件: 游客没有浏览图片的权限,请 登录注册
帮忙看看哪里错了,运行有错误
2016-06-12 17:31
快速回复:关于随机数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045952 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved