c语言中为数组随机赋值
已知一个6*6的二维数组,要求:1,为它赋入1-36的随机值2,数字不能重复3,数组用e[i][j]表示4,可以不用打印数组...
已知一个6*6的二维数组,要求:
1,为它赋入1-36的随机值
2,数字不能重复
3,数组用e[i][j]表示
4,可以不用打印数组 展开
1,为它赋入1-36的随机值
2,数字不能重复
3,数组用e[i][j]表示
4,可以不用打印数组 展开
4个回答
展开全部
//程序的思路是:数组的位置和要赋予的值都是二者都必须是随机产生的。否则做不到洗牌的效果
//首先随机产生数组行列的下标,然后判断该元素是否需要赋值
//确定需要赋值之后再产生1-36的随机数,判断产生的随机数是否已经存在
//不存在则将该位置赋值为这个数,存在则重新产生随机数,直到赋值成功。
#include <stdio.h>
#include <stdlib.h>
#include <ctime>
int e[6][6]={0}; //初值为0
int find(int i,int j)
{//对产生的随机位置判断是否需要赋值 (返回0需要,返回1不需要)
if(e[i][j]!=0)
return 1;
return 0;
}
int sure(int k)
{//对产生的随机数字判断是否已经存在于数组当中(返回1存在,返回0不存在)
for(int i=0;i<6;i++)
{
for(int j=0;j<6;j++)
{
if(k==e[i][j])
return 1;
}
}
return 0;
}
int main()
{
int i;int j;int k;int n=0;
srand((int)time(NULL));
while(n<36)
{
i=rand()%6;//产生随机位置
j=rand()%6;
if(find(i,j)==0)//确定随机位置是否需要赋值,是0表示需要赋值
{
while(1)//直到赋值成功结束
{
k=rand()%36+1;//产生随机数量
if(sure(k)==0)//确定随机数量是否已经存在
{
e[i][j]=k;
n++;
break;
}
}
}
// printf("%d ",n);
}
//printf("\n");
for(int i=0;i<6;i++)//输出
{
for(int j=0;j<6;j++)
{
printf("%2d ",e[i][j]);
}
printf("\n");
}
//getchar();
}
展开全部
//刚写的,测试通过,如果有疑问,欢迎交流
//思路是,保存一个1-36顺序存放的数组,然后每次随机的从这个数组里
//无放回的取数(也就是取出来一个数之后,从这个数组中删除)
//并把取出来的数,放入e[i][j]
//这样保证了1-36都出现且都只出现一次
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//从输出中删除一个元素
void remove_tar(int * a, int tar_idx, int n){
while(tar_idx + 1 < n){
a[tar_idx] = a[tar_idx + 1];
tar_idx++;
}
}
int main(){
srand(time(0));
int num_lib[36];
int e[6][6];
for(int i = 0; i < 36; i++)
num_lib[i] = i + 1;
int n = 36;
//洗牌的过程
for(int i = 0; i< 36; i++){
int cur_idx = rand()%n;
e[i/6][i%6] = num_lib[cur_idx];
remove_tar(num_lib, cur_idx, n);
n--;
}
//打印输出
for(int i = 0; i<6;i++){
for(int j = 0; j< 6; j++){
printf("%d ", e[i][j]);
}
printf("\n");
}
return 0;
}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void swap( int & a, int & b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int e[6][6];
int tmp[36][2];
int i,j;
srand( (unsigned int )time(0));
for( i = 0;i< 36;i++)
tmp[i][0] = i+1, tmp[i][1] = rand();
for( i = 0;i< 36;i++)
{
int k = i;
for( j= i+1 ;j<36;j++)
{
if( tmp[i][1] > tmp[j][1] )
k = j;
}
if( k != i)
{
swap( tmp[i][0],tmp[k][0]);
swap( tmp[i][1],tmp[k][1]);
}
}
int *p = (int*)e;
for( i = 0;i< 36; i++,p++)
*p = tmp[i][0],printf("%d " ,tmp[i][0]);
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
是随机位置赋值还是按顺序生成随机值?
随机位置赋值,相当于“洗牌”,就是1-36个数都要用上,顺序不定
按顺序生成随机值,会有重复数据出现,1-36不一定全出现。
随机位置赋值,相当于“洗牌”,就是1-36个数都要用上,顺序不定
按顺序生成随机值,会有重复数据出现,1-36不一定全出现。
追问
随机位置赋值
追答
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
int i,j,n,t;
int e[6][6]={0},*p; //数组初始化0
srand(time(NULL));
p=(int*)e; //通过一维数组方式进行赋值,因为数组是连续存放的,这样操作方便。
for( i = 1; i<= 36; i++){
n=rand()%36;
t=*(p+n) ; //备份随机位置上的数
*(p+n)=i; //随机位置赋值
if ( t ) //如果原位置上的数不是0
{
for( j=0;j<i;j++ ) //在0到当前位置上找个位置存放该数
if ( *(p+j)==0 )
break;
*(p+j)=t;
}
}
for(i = 0; i<6;i++){
for(j = 0; j< 6; j++){
printf("%2d ", e[i][j]);
}
printf("\n");
}
return 0;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询