如何从1-350这350个数字中一次性随机取25个数字(数字不要重复)?共380次(这350个数字被取的次数要尽可能平均)

解决方案 »

  1.   

    把1..350分成25段,每段ramdom一个就最平均啦,哈哈。(说笑)下面这个笨算法也只用了0.6秒
    var
      a: array[1..350] of integer;
      n, i, r: Integer;
      s: String;
      d1,d2: TDateTime;
      e: Extended;
    begin
      d1:= Now;  for n:= 1 to 380 do
      begin  for i:= 1 to 350 do
        a[i]:= i;  s:= '';
      i:= 1;
      while (i<25) do
      begin
        r:= Random(349)+1;
        if (a[r]<>0) then
        begin
          s:= s + IntToStr(a[r]) + '  ';
          a[r]:= 0;
          Inc(i);
        end;
      end;  m.Lines.Add(s);  end;  d2:= Now ;
      e:= (d2-d1)*86400;
      m.Lines.Add('Use:' + FloatToStr(e))
    end;
      

  2.   

    r:= Random(349)+1;怎么总是看见人家这样写?
    书上说Random(i)返回值是0..i-1, Random(349)+1的值就是1..349,少一个350啊,难道我的书错了?
      

  3.   

    还有更好的方法吗?
    还要将结果以5*5方格显示列印出来,共380张,如何将350*25个数字按此要求存到SQL数据库中呢?急啊~~~
      

  4.   

    int rand = new Random();
    int temp = 0;
    int[] randArray=new int[350];
    for(int i=0; i<350 ; i++){
      randArray[i] = (temp + Math.abs(rand%(350-i)))%350;
      temp = randArray[i]+1;
    }随便想出来的一个算法  没有测试过  如果不出错的话
    最后 randArray[]里面就应该是  0——349    350个随即数字了
      

  5.   

    楼上的GG就再给初学者一点明示,好人做到底,贴出Code,好不好?谢谢啦~~~