本文目錄一覽:
- 1、C語言怎麼實現隨機分配?
- 2、C語言隨機分配的問題。有1000個file, 每個file複製成10份,然後隨機分配給1000個人 如何實現
- 3、C語言中的 malloc,calloc函數分配存儲空間是隨機的嗎?
- 4、如何用c語言將100個女生隨機分為50組
- 5、如何使用c語言對數據隨機分組?
C語言怎麼實現隨機分配?
srand(
(unsigned)time(
NULL
)
);
;
num=rand()%k;
用這個生成隨機數你應該會吧
然後給6個長方形每個一個隨機數,排序,然後將較大的2個一組,較小的2個一組,中間2個一組
也可以給每個方塊一個0-2的隨機數,同時在生成隨機的時候加特判,如果對應數字的組裡滿了就重作隨機
由於方塊數少,不用太在乎演算法時間複雜度
C語言隨機分配的問題。有1000個file, 每個file複製成10份,然後隨機分配給1000個人 如何實現
1000個文件,我們給它編號成 0,1,2,到 999
複製成10份,也就是 0,1,2,到 999 每個號碼 重複 10 次。
把它們 放到數組中 int file_number[1000][10];
然後我們用洗牌的方法,把 file_number[t1][t2] 和 file_number[t3][t4]; 里的 文件號碼 交換。
t1,t2,t3,t4 是隨機數。洗它10 萬次,估計分布就很隨機了。
然後依次發給1000人,每人id 得 file_number[id][i] , i=0,1,…9.
==========
#includestdio.h
#includestdlib.h
#includemath.h
#includetime.h
int file_number[1000][10]; //大數組,用全局量
main()
{
int t1,t2,t3,t4,t;
int i,j,n=1000;
for (j=0;j1000;j++) for (i=0;i10;i++) file_number[j][i]=j; //初始文件號
srand(time(0)); //隨機種子
for (i=0;i100;i++)
for (j=0;j1000;j++){
t1=rand()%1000; t2 = rand()%10; //隨機下標
t3=rand()%1000; t4 = rand()%10; //隨機下標
t = file_number[t1][t2]; // 交換
file_number[t1][t2]= file_number[t3][t4]; // 交換
file_number[t3][t4] =t; // 交換
}
n=10; // 輸出前10人的文件號碼看看
for (j=0;jn;j++){
printf(“pernal_id=%d File_numbers:”,j);
for (i=0;i10;i++) printf(“%d “,file_number[j][i]);
printf(“\n”);
}
return 0;
}
C語言中的 malloc,calloc函數分配存儲空間是隨機的嗎?
是的,malloc和calloc函數都是向內存申請一定大小的空間,如果內存分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。
如何用c語言將100個女生隨機分為50組
以下程序供你參考
以下函數通過系統時間隨機生成1-100之間的隨機數,分成兩組後使其總和差值最小。
演算法分析:見源程序中的注釋,演算法可能有些許額誤差,共參考。
#includestdio.h
#includestdlib.h
#includetime.h
//******************產生長度為length的不為0的可重複隨機數組******************//
void radomArray(int *array,int length)
{
srand((unsigned)time(NULL));//使用系統時間作為隨機數的種子產生隨機數
int i=0,j=0;
while(jlength)
{
i=rand()%100;//0-100的隨機數,可做修改
if(i!=0)//隨機數不為0
{
array[j]=i;
j++;
}
}
}
//******************給數組排序,從大到小******************//
void sequence(int * array,int len)
{
int tmp=0;
for(int m=0;mlen;m++)
{
for(int n=0;nlen;n++)
{
if(array[m]array[n])
{
tmp=array[n];array[n]=array[m];array[m]=tmp;
}
else continue;
}
}
}
//******************將數組拆分為長度為len_01和長度為len_02的兩列並總和差值最小******************//
/*演算法分析:將有序數組(大到小)中數據依次分別放入數組1、數組2中,並分別統計其現有數據的總和,分別存入dat_01,dat_02中,
初始化判斷標準dat_01,dat_02為0;
根據數組現有數據總和dat_01和dat_02的關係,確定數據存入數組1還是數組2。
判斷過程:如果數組1現有數據總和小於數組2,同時數組1未到上限,將下一個數據存入數組1;
如果數組1現有數據綜合不小於數組2,同時數組2未到上限,將下一個數據存入數組2。
可能漏洞:數組1或數組2提前到達數組上限,導致原數組中剩餘數據直接轉入另一數組中,出現異常結果。*/
void seperate(int *arr,int * arr_01,int *arr_02,int len_01,int len_02)
{
int i=0,j=0,dat_01=0,dat_02=0;
for(int k=0;klen_01+len_02;k++)
{
if(dat_01dat_02ilen_01)//如果數組1數據總和小於數組2,同時數組1未到上限,將下一個數據存入數組1
{
arr_01[i]=arr[k];
dat_01+=arr[k];
i++;
}
else if(dat_01=dat_02jlen_02)//如果數組1數據不小於數組2,同時數組2未到上限,將下一個數據存入數
組2
{
arr_02[j]=arr[k];
dat_02+=arr[k];
j++;
}
}
}
//******************計算並返回長度為length的數組的數字總和******************//
int sum(int a[],int length)
{
int total=0;
for(int i=0;ilength;i++)
{
total+=a[i];
}
return total;
}
//******************主函數開始******************//
void main()
{
int data1=0,data2=0,tmp=0;
int len=100,len_01=50,len_02=50;//修改此處len,len_01,len_02即可修改初始數組長度,注意len_01+len_02=len,同
時最好len_01=len_02,防止出現異常。
int data[100],data_1[50],data_2[50];//上述len,len_01,len_02修改後,此處數組長度應相應修改。
radomArray(data,len);//產生100個數據的隨機數組
sequence(data,len);//給隨機數組從小到大排序
printf(“產生的隨機數組從小到大排列為:\n”);
for(tmp=0;tmplen;tmp++)//輸出隨機數組
printf(“%d\t”,data[tmp]);
printf(“\n”);
seperate(data,data_1,data_2,len_01,len_02);//將數組分為兩塊,使其總和差值最小
printf(“第一塊數組為:\n”);
for(tmp=0;tmplen_01;tmp++)
{
printf(“%d\t”,data_1[tmp]);
}
printf(“\n”);
printf(“第二塊數組為:\n”);
for(tmp=0;tmplen_02;tmp++)
{
printf(“%d\t”,data_2[tmp]);
}
printf(“\n”);
printf(“最原始數組的數據總和為:%d\n”,sum(data,len));
printf(“拆分後數組的數據總和為:%d\n”,sum(data_1,len_01)+sum(data_2,len_02));
printf(“第一塊數組的數據總和為:%d\n”,sum(data_1,len_01));
printf(“第二塊數組的數據總和為:%d\n”,sum(data_2,len_02));
printf(“兩塊數組數據的的差值為:%d\n”,sum(data_1,len_01)-sum(data_2,len_02));
}
運行結果:
產生的隨機數組從小到大排列為:
993 979 970 962 957 935 914 902 888 883
871 866 862 859 843 840 829 827 824 815
810 808 805 796 784 768 738 730 725 722
721 712 711 709 704 702 693 670 670 650
631 627 623 623 614 607 606 598 577 574
547 498 495 495 481 478 451 448 447 429
410 388 383 381 380 379 377 364 344 337
308 271 266 257 233 208 204 200 189 165
162 155 150 145 143 119 117 114 114 110
108 69 64 61 48 45 22 16 11 3
第一塊數組為:
979 970 957 902 883 871 859 840 829 815
810 805 768 738 725 721 709 702 670 670
631 623 607 606 574 498 495 481 451 447
410 383 379 377 337 271 266 233 200 189
155 145 119 117 114 108 61 45 11 3
第二塊數組為:
993 962 935 914 888 866 862 843 827 824
808 796 784 730 722 712 711 704 693 650
627 623 614 598 577 547 495 478 448 429
388 381 380 364 344 308 257 208 204 165
162 150 143 114 110 69 64 48 22 16
最原始數組的數據總和為:51116
拆分後數組的數據總和為:51116
第一塊數組的數據總和為:25559
第二塊數組的數據總和為:25557
兩塊數組數據的的差值為:2
Press any key to continue
如何使用c語言對數據隨機分組?
#include stdio.h
#include stdlib.h
#include time.h
int main()
{
int a[50]; //存放50個球
int i,cnt;
for( i=0;i50;i++ ) //標號
a[i]=i+1 ;
cnt=0;
srand( time(NULL) ) ;
while( cnt 25 ) //隨機取25個
{
i=rand()%50 ;
if ( a[i] != 0 )//防止重複計數
{
cnt++ ;
a[i]=0 ;//標記為已取
}
}
//以下為輸出分組結果
printf(“array 1:\n” );
cnt=0;
for( i=0;i50;i++ )
{
if ( a[i] == 0 )
{
cnt++ ;
printf(“%3d”, i+1 );
if ( cnt % 5 == 0 ) //每輸出5個一換行
printf(“\n”);
}
}
printf(“\n”);
printf(“array 2:\n” );
for( i=0;i50;i++ )
{
if ( a[i] )
{
cnt++ ;
printf(“%3d”, a[i] );
if ( cnt % 5 == 0 )
printf(“\n”);
}
}
printf(“\n”);
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/248064.html