| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5083 人关注过本帖
标题:在0——m范围内产生n个不同的随机数
只看楼主 加入收藏
末落
Rank: 1
来 自:四川德阳
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-2-23
结帖率:50%
收藏
已结贴  问题点数:20 回复次数:11 
在0——m范围内产生n个不同的随机数
只求方法,不要程序!
2012-03-20 14:03
moonnight
Rank: 5Rank: 5
等 级:职业侠客
帖 子:158
专家分:380
注 册:2012-3-17
收藏
得分:5 
用两个数组a[m]存放0~m的数,b[n]存放产生的n个随机数,有rand()%(m-n)来产生随机下标,每产生一个随机数,a[m]数组在对应下标后面的数向前移动1位
2012-03-20 14:15
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:3 
不知rand是否能满足你的要求

                                         
===========深入<----------------->浅出============
2012-03-20 14:15
moonnight
Rank: 5Rank: 5
等 级:职业侠客
帖 子:158
专家分:380
注 册:2012-3-17
收藏
得分:0 
发现上面没写清楚!
用rand()%(m-i);来产生随机下标!i是产生随机数的个数减一(0~19)
2012-03-20 14:28
jimmywood
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:109
注 册:2009-8-10
收藏
得分:2 
程序代码:
void randMN(int m, int n, int* arr)
{
    int *p = arr, *q;
    int x,y,u,v;
    while (n--)
    {
        x = rand()%(m--);
        u = v = 0;
        do
        {
            y = x + (u = v);
            v = 0;
            for (q = arr; q != p; q++)
            {
                if (y >= *q)
                {
                    ++v;
                }
            }
        } while (u != v);
        *p++ = y;
    }
}
2012-03-20 15:27
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:10 
当n远大于m时,老杨的做法就够了。
当n和m比较接近时,4楼的做法可取,但效率不高,尤其n和m比较大时。这一算法的时间复杂度是O(n*m)。
关于这一问题的实际应用中较多的做法是,将0~m保存在一个数组后(设数据为a),对a[i]与a[rand()%(m + 1)]进行对调(i = 0 to n - 1)。
对调完毕后数据前n个数即可作为产生的随机序列。
a数组可以反复使用,需要新的随机序列时可以直接再进行一轮对调,不必重新初始化为0~m的序列。时间复杂度为O(n)。

重剑无锋,大巧不工
2012-03-20 15:33
依然惊涛
Rank: 2
来 自:山东 北京
等 级:论坛游民
帖 子:22
专家分:15
注 册:2011-7-5
收藏
得分:0 
for(i = 0; i < n; i++){
    a[i] = rand()%(m+1)   //假设数组已经定义
}
2012-03-20 15:37
C_戴忠意
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:2
帖 子:575
专家分:1349
注 册:2011-10-21
收藏
得分:0 
拜读

编程之路定要走完……
2012-03-20 15:57
jimmywood
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:30
专家分:109
注 册:2009-8-10
收藏
得分:0 
回复 6楼 beyondyf
4楼的做法? 是说我? 我是5楼...
起初的想法只是不想复制数据和频繁移动数据 但刚写完也发现当m,n接近或n很大时 这个做法不效率 得不偿失 呵呵
对调的方法挺好 学习了
2012-03-20 15:59
moonnight
Rank: 5Rank: 5
等 级:职业侠客
帖 子:158
专家分:380
注 册:2012-3-17
收藏
得分:0 
回复 6楼 beyondyf
学到了!
只是能不能解释下第一句话
2012-03-20 16:18
快速回复:在0——m范围内产生n个不同的随机数
数据加载中...
 
   



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

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