| 查看: 1780 | 回复: 14 | |||
| 当前主题已经存档。 | |||
yy5393金虫 (小有名气)
|
[交流]
【求助】如何生成没有重复的随机数
|
||
| 我想在1-2500之间生成200个没有重复的随机数,我编了好长时间都不对,哪位虫友知道指点一下或者有类似的程序分享一下,真是不胜感激啊! |
» 猜你喜欢
实验室接单子
已经有4人回复
全日制(定向)博士
已经有4人回复
假如你的研究生提出不合理要求
已经有6人回复
对氯苯硼酸纯化
已经有3人回复
求助:我三月中下旬出站,青基依托单位怎么办?
已经有12人回复
不自信的我
已经有12人回复
所感
已经有4人回复
要不要辞职读博?
已经有7人回复
北核录用
已经有3人回复
26申博(荧光探针方向,有机合成)
已经有4人回复

woshilsh
荣誉版主 (职业作家)
- 应助: 43 (小学生)
- 贵宾: 10.33
- 金币: 21115.1
- 散金: 737
- 红花: 22
- 帖子: 3777
- 在线: 639.7小时
- 虫号: 293038
- 注册: 2006-11-04
- 专业: 计算机应用技术
- 管辖: 仿真模拟

2楼2009-04-02 22:17:00
3楼2009-04-02 22:36:57
lynarcissusly
金虫 (正式写手)
- 应助: 3 (幼儿园)
- 金币: 1271.7
- 散金: 1
- 红花: 3
- 帖子: 340
- 在线: 173.8小时
- 虫号: 470031
- 注册: 2007-11-29
- 专业: 凝聚态物性 II :电子结构
4楼2009-04-03 14:10:13
★ ★
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:23
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:23
|
这是我想到的方法,以100个中取10个为例,用MATLAB搞的 >> a=rand(1,11)' a = 0.6813 0.3795 0.8318 0.5028 0.7095 0.4289 0.3046 0.1897 0.1934 0.6822 0.3028 >> a=cumsum(a) a = 0.6813 1.0608 1.8926 2.3954 3.1048 3.5337 3.8383 4.0280 4.2214 4.9037 5.2064 >> a=a.*100./a(end) a = 13.0853 20.3740 36.3504 46.0079 59.6348 67.8726 73.7234 77.3660 81.0813 94.1848 100.0000 >> a=round(a) a = 13 20 36 46 60 68 74 77 81 94 100 >> a=a(1:end-1) a = 13 20 36 46 60 68 74 77 81 94 >> |
5楼2009-04-12 23:23:02
★ ★
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:24
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:24
|
还可以在生成随机数后每个值都加上一个常数,来保证间隔,比如说间隔不小于6,不过这地方要算一下,我想应该是能做到的,就是说在第一步生成随机数后加上一步 >> a=rand(1,11)' a = 0.5298 0.6405 0.2091 0.3798 0.7833 0.6808 0.4611 0.5678 0.7942 0.0592 0.6029 >> a(2:end-1)=a(2:end-1)+0.2 a = 0.5298 0.8405 0.4091 0.5798 0.9833 0.8808 0.6611 0.7678 0.9942 0.2592 0.6029 这个加上的值怎么调还要算一下,我忽然想到的,不知对不对 [ Last edited by fspdlh on 2009-4-13 at 00:16 ] |
6楼2009-04-12 23:30:51
7楼2009-04-13 00:04:06
★ ★
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:25
sunxiao(金币+2,VIP+0):谢谢参与,欢迎常来仿真编程版 4-13 22:25
|
这是从0到100之间生成10个间隔大于5的随机数 >> M=100 M = 100 >> n=10 n = 10 >> d=5 d = 5 >> t=d*(n+1)/(2*(M-d*n+d)) t = 0.5000 >> a=rand(1,11)' a = 0.9501 0.2311 0.6068 0.4860 0.8913 0.7621 0.4565 0.0185 0.8214 0.4447 0.6154 >> a(2:end-1)=a(2:end-1)+0.5 a = 0.9501 0.7311 1.1068 0.9860 1.3913 1.2621 0.9565 0.5185 1.3214 0.9447 0.6154 >> a=cumsum(a) a = 0.9501 1.6813 2.7881 3.7741 5.1654 6.4275 7.3840 7.9025 9.2239 10.1686 10.7840 >> a=a.*100./a(end) a = 8.8105 15.5904 25.8541 34.9971 47.8987 59.6021 68.4714 73.2795 85.5329 94.2931 100.0000 >> a=round(a) a = 9 16 26 35 48 60 68 73 86 94 100 >> a=a(1:end-1) a = 9 16 26 35 48 60 68 73 86 94 >> [ Last edited by fspdlh on 2009-4-24 at 09:20 ] |
8楼2009-04-13 00:23:09
9楼2009-04-13 17:36:11
★
小木虫(金币+0.5):给个红包,谢谢回帖交流
小木虫(金币+0.5):给个红包,谢谢回帖交流
|
#include #include char RandomData[2500]; int ActureData[200]; void InitData() { memset(RandomData,0,2500); } void CreatData() { int Num=0; int Data; while(Num<200) { Data=random(2500); if(RandomData[Data]) continue; RandomData[Data]=1; ActureData[Num++]=Data; } } void main() { randomize(); InitData(); CreateData(); } 200个随机数字存在ActureData数组里,没有排过序,如果需要排序的话,修改下CreateData函数如下: void CreateData() { int Num=0,index=0; int Data; while(Num<200) { Data=random(2500); if(RandomData[Data]) continue; RandomData[Data]=1; Num++; } Num=0; while(index<200) { if(RandomData[Num]) ActureData[index++]=Num; Num++; } } [ Last edited by duyingchun on 2009-6-1 at 14:14 ] |
10楼2009-06-01 14:03:48












回复此楼