int a[4],b;
static int mid[]={23,21,87,12,67,96,51,3,48,60};/////原数组
int i=0;
for( i=0;i<4;i++)        //
{
       b=(10-i)*rand()/32767;//////////取随机顺序       
       a[i]=mid[b];
       mid[b]=mid[9-i];
       mid[9-i]=a[i];
}
//////数组a[]即是所求

解决方案 »

  1.   

    它们有顺序之分吗?
    没有时:(有顺序时可以从没有中排列得到)
    用一个32位的数(只用到了低10位,16位也可以)的各个位来标明对应的数要不要在数组中
    比如说:(0x0286)000000 1010000110 说明第1,2,7和9(0开始计)的数被选择
    编程:
    int t;
    for(DWORD i=0x0000;i<0x0200;i++)
    {
        t=0;
        for(int j=0;j<10;j++)
        {
            if( i & 1<<j )
                 t++;
            if(t>4)
                 break;
        }
        if(t==4)
        {
            //从i中得到要选择的数(不想写了)
        }
    }
      

  2.   

    hehe,笨方法又有了
    CString st,m_data;
    int a[4];
    static int mid[]={23,21,87,12,67,96,51,3,48,60};
    int i,i1,i2,i3,i4,ii;
    for( i=0;i<7;i++)
       for(i1=i;i1<7;i1++)
          for(i2=i1+1;i2<8;i2++)
      for(i3=i2+1;i3<9;i3++)
           for(i4=i3+1;i4<10;i4++)
      {                        m_data+="\r\t"; 
      a[0]=mid[i1];
      a[1]=mid[i2];
      a[2]=mid[i3];
      a[3]=mid[i4];
                        for(ii=0;ii<4;ii++)
    {
                st.Format ("%d ",a[ii]);
                        m_data+=st;       
    }
                   
     }
    ////////调试通过///////显示m_data可以查看结果;