我从14个数中取10个随机数
怎么做都有两个是重复的,请赐教!!!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    var a:array[1..14]of integer;//14个数
        b:array[1..10]of integer;//结果
        c:array[1..14]of  boolean;//标志,默认false
        i,temp:integer;
    begin
        for i:=1 to 14 DO
         begin
          a[i]:=i;
          c[i]:=false;
         end;
        for i:=1 to 10 do
          begin
            temp:=Random(14)+1;
            while c[temp]=true do
              begin
                temp:=Random(14)+1;
              end;
            b[i]:=temp;
            c[temp]:=true;
          end;
        ListBox1.Clear;
        for i:=1 to 10 do
        ListBox1.Items.Add(IntToStr(b[i]));
    end;
      

  2.   

    这是一个类似洗牌的问题
    我修改一下楼上的代码procedure TForm1.Button1Click(Sender: TObject);
    var
      b:array[1..14]of integer;//14个数
      i,temp:integer;
    begin
      for i:=1 to 14 DO
        b[i]:=i;
      ListBox1.Clear;
      for i:=1 to 10 do
      begin
        temp:=Random(14-i+1)+1;
        ListBox1.Items.Add(IntToStr(b[temp]));
        b[temp]:=b[14-i+1];
      end;
    end;
      

  3.   

    我的错了一点,改一下
    procedure TForm1.Button1Click(Sender: TObject);
    var a:array[1..14]of integer;//14个数
        b:array[1..10]of integer;//结果
        c:array[1..14]of  boolean;//标志,默认false
        i,temp:integer;
    begin
        for i:=1 to 14 DO
         begin
          a[i]:=i;
          c[i]:=false;
         end;
        for i:=1 to 10 do
          begin
            temp:=Random(14)+1;
            while c[temp]=true do
              begin
                temp:=Random(14)+1;
              end;
            b[i]:=a[temp];
            c[temp]:=true;
          end;
        ListBox1.Clear;
        for i:=1 to 10 do
        ListBox1.Items.Add(IntToStr(b[i]));
    end;
      

  4.   

    描述一下算法。
    数组 b 记录 1~14第一次从 b[1] ~ b[14]中任意选择一个数,作为第一个数;
    剔除此数,把最末一个数b[14]添到这个位置;第二次从b[1] ~ b[13]中任意选择一个数,作为第二个数;
    剔除此数,把最末一个数b[13]添到这个位置;.....第十次从b[1] ~ b[4]中任意选择一个数,作为第十个数;
    剔除此数,把最末一个数b[10]添到这个位置;这样写时间复杂度最低。
      

  5.   

    类似的算法还有一种
    就是随机生成2个数m,n,然后交换
    b[m]<==> b[n];当这个操作进行了足够次数的时候,
    我们取从b[1]到b[10] 他一定是随机数序列,这个办法的效率比较低,你了解就行了,他的效果和上面的代码是相同的。
      

  6.   

    pazee(耙子) 的算法好,佩服,学习
      

  7.   

    pazee(耙子) 算法不错,学习
      

  8.   

    不知道boolean和int能不能转换,或者boolean能不能直接相加,如果上述两种方法有一个可以实现
    那么可用这个算法
    因为只是从14个数中随机
    可以声明一个boolean数组长度14,分别代表14个数,随机到相应的数相应的位置true
    随机函数执行完14次后,把数组的内容加起来若小于10则表明随机过程中有重复,继续随机。另外,14个数中取10个不如14个中取4个然后从中去除这4个数菜鸟回帖不要笑