C语言随机数,乱序问题

我在想一个简单的乱序怎么生成,我写了顺序,然后打乱,请教一下大神怎么打乱才能让熵大。

源码在下:

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值