请问各位,如何在连续的n个自然数中随机抽取3个不同的数?

pan666 2003-05-21 12:22:36
请问各位,如何在连续的n个自然数中随机抽取3个不同的数?如n=50,则在1-50中取,n=100则在1-100中取,谢谢!
...全文
476 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
踢踏 2003-05-21
  • 打赏
  • 举报
回复
to myling(阿德) :
谢谢提醒,刚才考虑不周。

以下程序只提供思路,没有测试过。

repeat
Randomize; //初始化随机数
a:=Random(n-1)+1; //如果n=50,0<=Random(50-1)<=49
b:=Random(n-1)+1;
c:=Random(n-1)+1;
until (a<>b) and (b<>c) and (a<>C)
耙子 2003-05-21
  • 打赏
  • 举报
回复
呀! 阿德 成猩猩了!恭喜!
myling 2003-05-21
  • 打赏
  • 举报
回复
楼主看看这贴吧,和你的要求相似


http://expert.csdn.net/Expert/topic/1767/1767707.xml?temp=.6174433
myling 2003-05-21
  • 打赏
  • 举报
回复
xxmmmx,你这样可能会取出重复的数字!
firetoucher 2003-05-21
  • 打赏
  • 举报
回复
s[3]: int;
s[1]=s[2]=s[0]=-1;
Randomize;//
for i:= 0 to 2 do
begin
s[i]:= rand()*n;
for j := 0 to i -1 do
if (s[i] = s[j]) and (i <> 0) then
begin
i:= i-1;
break;
end;
end;
输出s
踢踏 2003-05-21
  • 打赏
  • 举报
回复
var
a,b,c: Integer;

Randomize; //初始化随机数
a:=Random(n-1)+1; //如果n=50,0<=Random(50-1)<=49
b:=Random(n-1)+1;
c:=Random(n-1)+1;

hanzq 2003-05-21
  • 打赏
  • 举报
回复
to chechy(简简单单的活)
厉害!真是个好方法
chechy 2003-05-21
  • 打赏
  • 举报
回复
很Easy的,将这些连续的数字放入数组中,然后,随机交换数组中任意两个位置的数字,交换n(n越大,越随机)次后,取数组中的前三个就可以呢。
耙子 2003-05-21
  • 打赏
  • 举报
回复
我这都是灌水管出来的,这个和水平不成正比的。
myling 2003-05-21
  • 打赏
  • 举报
回复
呵呵,耙子,谢谢了

不能和你比呀

那天到C那边逛了一圈,原来你在那边也是双星,哈,厉害,佩服


俺出了delphi区全是一个小三角,哈哈,除了水源
耙子 2003-05-21
  • 打赏
  • 举报
回复
对了楼主这类的问题,可以认为是 从 1~m个连续数字中,取n个不重复的。

这个按照效率可分为2个办法,

1.当 m 和 n 比较接近,类似楼上说的例子 14取10,如果每次都是从14中取一个,这时候取重复数概率比较高,大约每次的重复的概率是 1/14,可以采用阿德帖子里面的算法,因为用一个数组存储m的开销不大。

2.当 m >> n, 我们认为每次取数的概率非常低了,存储m的开销变大了(比如m=1000,我们需要一个1000个元素的数组),我们就只把每次去出来的数纪录就行了,如果重复了,重新抽取一次,这样的开销是最小的。


当然了,这个m和n的界定是一个模糊的概念,看你自己了。
leonkim 2003-05-21
  • 打赏
  • 举报
回复
同意楼上.

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧