免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 31126 | 回复: 52
打印 上一主题 下一主题

[算法] 怎么产生n个不重复等概率随机数?? [复制链接]

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-28 19:42 |只看该作者 |倒序浏览
本帖最后由 egmkang 于 2010-03-02 15:11 编辑

记得以前在哪里看到过,忘了,特来问问.
随即整数,小于某个常量C,n<C的.
要求不能重复,而且数字出现的概率相等.

谢谢了

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
2 [报告]
发表于 2010-02-28 19:43 |只看该作者
哦,还有一条,要求时间复杂度的....
O(N^2)是个人都能做.....

论坛徽章:
0
3 [报告]
发表于 2010-02-28 20:54 |只看该作者
查找。

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
4 [报告]
发表于 2010-02-28 21:26 |只看该作者
建立一个数组[0..c) 然后打散它 然后一个一个的取

论坛徽章:
0
5 [报告]
发表于 2010-02-28 21:37 |只看该作者
一个经典的方法大概是这样的:
  1. for (i = 0; i < n; i++)
  2.         x[i] = i;
  3. for (i = 0; i < n - 1; i++) {
  4.         j = rand(n - i - 1);
  5.         temp = x[i];
  6.         x[i] = x[j];
  7.         x[j] = temp;
  8. }
复制代码
原先是从0到n-1中取m个不重复的随机样本,这里m为n的时候应该就是你要的一个解

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
6 [报告]
发表于 2010-03-01 08:19 |只看该作者
回复 5# daybreakcx


    昨天晚上想到了,就一个洗牌算法.
这样能保证是等概的嘛?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
7 [报告]
发表于 2010-03-01 09:49 |只看该作者
回复  daybreakcx


    昨天晚上想到了,就一个洗牌算法.
这样能保证是等概的嘛?
egmkang 发表于 2010-03-01 08:19



   如果rand函数是等概的,则以上算法所得到的每个排列是不等概的.

论坛徽章:
0
8 [报告]
发表于 2010-03-01 10:47 |只看该作者
回复 1# egmkang


    设f(C, n) 为1 .. C中n个不重复的随机数 (n <= C).

那么 f(1, 1) = { 1 }.
当 C > 1 时:
  令u ~ uniform(0, 1)
  f(C, n) = {C, f(C - 1, n - 1)} if u < n / C
  f(C, n) = {f(C - 1, n)} otherwise

论坛徽章:
0
9 [报告]
发表于 2010-03-01 12:13 |只看该作者
这个题太高难了。。

凡是算法的都是我不能解决的

论坛徽章:
0
10 [报告]
发表于 2010-03-01 13:08 |只看该作者
回复  daybreakcx


    昨天晚上想到了,就一个洗牌算法.
这样能保证是等概的嘛?
egmkang 发表于 2010-03-01 08:19
  1. for (i = 0; i < n; i++)
  2.         x[i] = i;
  3. for (i = 0; i < n - 1; i++) {
  4.         j = i + rand(n - i);//change here
  5.         temp = x[i];
  6.         x[i] = x[j];
  7.         x[j] = temp;
  8. }
复制代码
原先程序取j的时候有点错误,改正如上,可以保证等概率,只要rand等概率,证明如下:
每次选取从i到n-1的n-i个数值来交换,所以
对于x[0],取每个数值的概率是1/n(在n个数值中取一个)
对于x[1],取每个数值的概率是1/(n-1)*(n-1)/n=1/n,之所以不是1/(n-1)是因为要在保证x[0]没有取到这个值的情况之下((n-1)/n),等概率取剩下n-1个数值,n-1就削掉了
……以下由此类推
每次对于x取t的概率都是保证x[0]没取t时(n-1)/n,x[1]也没取t时(n-2)/(n-1),...,x在剩下的n-i个数值中取到t的概率1/(n-i)的乘积,所以大家都是1/n.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP