如题,我现在想知道如何使20张照片随机的排列

解决方案 »

  1.   

    管你是20个什么
    都可以采取数组数据结构,然后抽象为20个数<下标>之类的复杂度为 o(n) = n(n-1)/2 理论上你的随机数的范围尽量取大一点
    比如为 rand(1000000) mod 20;
      

  2.   

    var
      FileName:   array[0..19] of string; // 保存所有的文件名
      ExistIndex: array[0..19] of BYTE;   // 保存已经选取的图片<文件下标> 唯一
      NowIndex:   Integer; // 保存当前ExistIndex中的已经正确选取的文件的下标  I: Integer;
      I := 0;
      // 0. 初始化数据FileName 为你的文件名
      // 1. 初始化数组ExistIndex 都为255 表示都没有...
      while I < 20 do
      begin
        // 1. 产生随机数N<就是下标>
        // 2. 将此下标到ExistIndex中查找 
        // 2.1 如果找到 说明重复 继续
        // 2.2 如果没找到 则
        // 2.2.1 Inc(I);
        // 2.2.2 将N加到数组ExistIndex中 ExitIndex[NowIndex] := N
        // 走了 代码很简单 这个算法也比较简单...有问题 明天再说 OK?
      end;
      

  3.   

    我不明白黄金猎人为什么要random(1000000),为什么不是random(20),反正重复的话再随机产生一次啊
      

  4.   

    //判断一个整数是否存在于一个数组中
    function IntExist(OprInt: Integer; MyArray: array of Integer): Boolean;
    var
      i: Integer;
    begin
      Result := False;
      for i := 0 to High(MyArray) do
        if OprInt = MyArray[i] then
        begin
          Result := True;
          Break;
        end;
    end;  //产生随机数组
      SetLength(RandomArray, 20);
      i := 0;
      repeat
        Randomize;
        tempInt := Random(21); //这里产生0~20的随机数
        if not IntExist(tempInt, RandomArray) then //这里可以排除0
        begin
          RandomArray[i] := tempInt;
          Inc(i);
        end;
      until i = 20;
      

  5.   

    随机产生20个字串,对这20个字串做HASH排列就OK了
      

  6.   

    我不明白黄金猎人为什么要random(1000000),为什么不是random(20),反正重复的话再随机产生一次啊虽然说 random(100000) mod 20 跟 random(19)都是一样的。。
    但是 random(100000)所能产生的数空间更大...<当然了 这些都是所谓的伪随机数..>
    这样的话 重复性是更小一点...OK 楼上的代码应该可以搞定了 楼主还没搞清楚么,我上面的算法应该是比较清楚的吧。。
      

  7.   

    X := random(i)产生随机数要注意范围:0<= X <i
      

  8.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      iVal: array[0..19] of Integer;
      i, iTmp: Integer;
    begin
      Randomize;
      for i := 0 to 19 do
        iVal[i] := 0;  repeat
        iTmp := Random(20) + 1;
        for i := 0 to 19 do
        begin
          if iVal[i] = iTmp then
            break
          else if iVal[i] = 0 then
          begin
            iVal[i] := iTmp;
            break;
          end;
        end;
      until (iVal[19] <> 0);
    end;