请问各位,如何在连续的n个自然数中随机抽取3个不同的数?如n=50,则在1-50中取,n=100则在1-100中取,谢谢!

解决方案 »

  1.   

    很Easy的,将这些连续的数字放入数组中,然后,随机交换数组中任意两个位置的数字,交换n(n越大,越随机)次后,取数组中的前三个就可以呢。
      

  2.   

    to  chechy(简简单单的活) 
      厉害!真是个好方法
      

  3.   

    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;
      

  4.   

    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
      

  5.   

    xxmmmx,你这样可能会取出重复的数字!
      

  6.   

    楼主看看这贴吧,和你的要求相似
    http://expert.csdn.net/Expert/topic/1767/1767707.xml?temp=.6174433
      

  7.   

    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)
      

  8.   

    对了楼主这类的问题,可以认为是 从 1~m个连续数字中,取n个不重复的。这个按照效率可分为2个办法,1.当 m 和 n 比较接近,类似楼上说的例子 14取10,如果每次都是从14中取一个,这时候取重复数概率比较高,大约每次的重复的概率是 1/14,可以采用阿德帖子里面的算法,因为用一个数组存储m的开销不大。2.当 m >> n, 我们认为每次取数的概率非常低了,存储m的开销变大了(比如m=1000,我们需要一个1000个元素的数组),我们就只把每次去出来的数纪录就行了,如果重复了,重新抽取一次,这样的开销是最小的。
    当然了,这个m和n的界定是一个模糊的概念,看你自己了。
      

  9.   

    呵呵,耙子,谢谢了 不能和你比呀那天到C那边逛了一圈,原来你在那边也是双星,哈,厉害,佩服
    俺出了delphi区全是一个小三角,哈哈,除了水源