我在想一个简单的乱序怎么生成,我写了顺序,然后打乱,请教一下大神怎么打乱才能让熵大。
源码在下:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 10
//随机数运算要简单,需要时间短,大神求交换s与N的关系
//得到一个不重复的随机序列,上限N-1,下限0
int luan ( int down,int up ,int arr[N] )
{
/*生成顺序的数,再进行随机两个数交换,需要知道交换次数多少才乱*/
int i;
int s=7;//两个数交换次数,朋友告诉我10个体是7能达到熵最大
//100次要交换几次,s和N的关系,请教大神
int *a,*b,t;//为了下面交换
for ( i=down; i<up+1; i++ )
{
arr[i]=i;
//顺序给他值,=下标
}
for ( i=0; i<s; i++ )
{
a=&arr[rand() % ( up+1-down ) +down];
b=&arr[rand() % ( up+1-down ) +down];
t=*a;
*a=*b;
*b=t;
//随机两数交换,生成随机序列
}
return 0;
}
//得到一个不重复的随机序列,上限N-1,下限0
int Rand ( int down,int up ,int arr[N] )
{
//这方法请大神们看下好没
int i;
int f;//第一个下标
int n;//下标
int t,h;//交换
for ( i=down; i<up+1; i++ )
{
arr[i]=i;
//顺序给他值,=下标
}
f=rand() % ( up+1-down ) +down;
//生成down到up的数
n=rand() % ( up+1-down ) +down;
t=arr[f];
//下标,生成的这个数会和t交换;
while ( n!=f )
{
//交换,在下标和第一个相同就停
h=t;
t=arr[n];
arr[n]=h;
n=rand() % ( up+1-down ) +down;
}
//当下标和第一个相同,t和arr[f]换
arr[f]=t;
return 0;
}
int main()
{
int arr[N]= {0};
int i;
srand ( ( int ) time ( NULL ) );
//初始随机数
luan ( 0,N-1 , arr );
for ( i=0; i<N; i++ )
{
printf ( "%d ",arr[i] );
}
printf ( "\n" );
//第二种,请看一下
Rand ( 0,N-1 , arr );
for ( i=0; i<N; i++ )
{
printf ( "%d ",arr[i] );
}
getchar();
return 0;
}