| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 583 人关注过本帖
标题:如何随机产生1到20间的20个不重复的数
只看楼主 加入收藏
狸之城堡
Rank: 1
等 级:新手上路
帖 子:15
专家分:8
注 册:2014-2-28
结帖率:75%
收藏
已结贴  问题点数:20 回复次数:7 
如何随机产生1到20间的20个不重复的数
如何随机产生1到20间的20个不重复的数,各位大神有木有什么好的算法,拜托啦
搜索更多相关主题的帖子: 如何 
2014-02-28 15:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
产生一个随机数先
然后再产生的数和之前的比较
如重复则一直产生 一直比较  直到完成目标为止

DO IT YOURSELF !
2014-02-28 15:40
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
产生一个随机数先
然后再产生的数和之前的比较
如重复则一直产生 一直比较  直到完成目标为止

DO IT YOURSELF !
2014-02-28 16:22
xp0213
Rank: 7Rank: 7Rank: 7
来 自:湖北武汉
等 级:黑侠
威 望:1
帖 子:210
专家分:522
注 册:2011-10-26
收藏
得分:0 
2014-02-28 16:51
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9007
专家分:53942
注 册:2011-1-18
收藏
得分:5 
首先怎么产生一个[1,20]的随机数?这个你应该懂吧,就是 (int)( rand()/(RAND_MAX+1.0)*20+1 )

产生20个不重复的数,最常见的就是 洗牌算法:
1. 先构建一个 buf{ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 } 数组
2. 产生一个[0,19]区间内的随机数,设为 a,将buf[a]和buf[19]对调
3. 产生一个[0,18]区间内的随机数,设为 b,将buf[b]和buf[18]对调
4. 产生一个[0,17]区间内的随机数,设为 c,将buf[c]和buf[17]对调
……
结束后,buf中就是你要的20个[1,20]范围内不重复的数

从理论上讲,“20个[1,20]范围内不重复的数”共有 20!=2432902008176640000 种排列方式,因此最小只需要调用 log(2432902008176640000)/log(RAND_MAX+1) 次 rand 函数就行了。依此,你可以优化上述的洗牌算法。

如果你用C++的话,可以直接用 random_shuffle 函数
2014-02-28 17:00
klapset
Rank: 4
等 级:业余侠客
威 望:2
帖 子:71
专家分:234
注 册:2014-2-27
收藏
得分:0 
连续求20次ramdom value,并且把每次求得的ramdom value 作为哈希key存储下来,最后检查有无重复,有重复,按个数继续求。没有则结束。

[ 本帖最后由 klapset 于 2014-2-28 17:08 编辑 ]
2014-02-28 17:04
去年丶夏天
Rank: 2
等 级:论坛游民
威 望:1
帖 子:10
专家分:28
注 册:2014-2-19
收藏
得分:15 
程序代码:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main(void)
{
        int arr[20] = {0};
        int i = 0;
        int num = 0;
        int flag = 0;
        srand( (unsigned)time( NULL ) );
        do
        {
                i = -1;
                flag = 0;
                num = rand() % 21;
                while(arr[++i])
                {
                        if(num == arr[i])
                        {
                                flag = 1;
                                break;
                        }
                }
                if(!flag)
                {
                        arr[i] = num;
                }
        }while(i <= 20);

        for(i = 0; i < 20; i++)
                printf("%d  ",arr[i]);
        printf("\n");
        return 0;
}
2014-02-28 17:38
狸之城堡
Rank: 1
等 级:新手上路
帖 子:15
专家分:8
注 册:2014-2-28
收藏
得分:0 
回复 7楼 去年丶夏天
ok解决了
2014-03-01 16:46
快速回复:如何随机产生1到20间的20个不重复的数
数据加载中...
 
   



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

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