隨機演算法c
#include<stdio.h>
#include<stdlib.h>
intmain()
{
inti,count,n,m;
srand(time(NULL));
//以當前時間為隨機數種子,以產生不同的隨機數列
n=(rand(n)%100)+1;
count=1;
while(count<=10){
printf("輸入您的猜測數字(1~100):");
scanf("%d",&m);
if(m==n){
printf("恭喜您猜對了!總計猜%d次! ",count);
return0;
}
elseif(m<n){
printf("太小,");
}
else{
printf("太大,");
}
printf("剩餘%d次機會! ",10-count);
count++;
}
printf("超出嘗試次數,游戲結束! ");
return0;
}
❷ 求「米勒-拉賓素數隨機測試演算法」C語言代碼+詳細注釋。財富不是問題!!!
//參數入口為test(lld n)
typedef __int64 lld;
const lld MAX=10;
lld multi(lld a,lld b,lld m)//加法代替乘法,防止溢出__int64
{
lld ret=0;
a%=m;
while(b)
{
if(b&1) if((ret+=a)>=m) ret-=m;
if((a<<=1)>=m) a-=m;
b>>=1;
}
return ret;
}
lld mod(lld a,lld b,lld m)
{
lld x,y;
if(b==1)//1次冪,直接返回
return a%m;
x=mod(a,b>>1,m);//二分求冪
y=multi(x,x,m);//平方一下
if(y==1&&x!=1&&x!=m-1)//如果結果是1的時候,如果x不是1而且不是m-1那麼m必然不是素數。
return 0;
if(b&1)//奇數的情況,再乘上一個a
y=multi(y,a,m);
return y;
}
lld gen(lld m)
{
lld ret=1,i;
for(i=0;i<4;i++)
ret*=rand();
ret%=m;
if(ret<0)
ret+=m;
return ret;
}
//入口
bool test(lld n)
{
lld a,i,tmp;
if(n<2)//小於2不是素數
return 0;
if(n==2)//2是素數,直接返回
return 1;
if((n&1)==0)//偶數
return 0;
for(i=0;i<MAX;i++)//測試最大次數
{
a=gen(n-1)+1;//生成一個2到n-2的數字
tmp=mod(a,n-1,n);//快速冪
if(tmp!=1)//結果不是1,不是素數
return 0;
}
return 1;//是素數
}
❸ 如何運用C語言實現隨機事件
問題1:隨機事件的C/C++語言實現。
第1題:產生隨機數(完型填空)
(1)函數說明
rand()會返回一隨機數值,范圍在0至RAND_MAX 間。在調用此函數產生隨機數前,必須先利用srand()設好隨機數種子,如果未設隨機數種子,rand()在調用時會自動設隨機數種子為1。
0<= rand()<=RAND_MAX(32767=216-1)
試問:產生0到100之間的隨機數的C表達式是什麼?
100*rand()/32767
(2)參考「原型」
#include "iostream.h"
#include "stdlib.h"
#include "time.h" /*需引用的頭文件*/
void out_rand()
{
srand(time(0)); //隨機種子
for(int i=0;i<10;i++)//產生10個0到100隨機數
{
cout<<100*rand()/RAND_MAX<<endl;
}
}
void main()
{
int n;
while(1)
{
cout<<」1----產生隨機數; 2----退出系統」<<endl;
cin>>n;
if(n==1) out_rand();
if(n==2) break;
}
}
(3)設計任務(「好」的演算法:時間代價——語句、空間代價——佔用「內存」)
利用產生隨機數的編程技術,產生一個隨機系統48個0到99之間的「需求量」隨機數,並按間距為10統計各「需求量」區間的數據個數。
#include 「iostream.h」
#include 「stdlib.h」
#include 「time.h」 (填空)
void out_rand()
{
int a[48],I,k;(填空)
for(i=0;i<48;i++) a[i]=0;
srand(time(0));
for(i=0;i<48;i++)
{
k=(99-0+1)* rand()/RAND_MAX+0;
a[(k-0)/10]++;
(例子:
k=(199-100+1)* rand()/RAND_MAX+100;
a[(k-100)/10]++;
)
}
for(i=0;i<100;i+=10)
{
cout<<i<<」----「<<i+9<<」的數據個數: 「<<a[(i-0)/10](要改)<<endl;
}
}
void main()
{
int n;
while(1)
{
cout<<」1----產生隨機數; 2----退出系統」<<endl;
cin>>n;
if(n==1) out_rand();(填空)
if(n==2) break;
}
}
問題2:數據排序的C/C++語言實現。
第1題:起泡法(上推排序法)
1、「原型」(從小到大排序)
#include 「iostream.h」
void bubble_sort(int *item,int count)
{
register int I,j;
int t;
for(i=0;i<count-1;i++)
//每一遍後都能將i及其後面的數據中的最小值排在最前面(i處)。
for(j=count-1;j>=I;--j)
if(item[j-1]>item[j])
{t=item[j-1];item[j-1]=item[j];item[j]=t;}
}
void main()
{
int a[]={6,8,3,9,7,4,5,1,2};
bubble_sort(a,9);
for(int i=0;i<9;i++)
cout<<a[i]<<」 「;
cout<<endl;
}
2、實踐
(1)調試該「原型」,分析其執行功能。
(2)從鍵盤輸入10個「實數」,請用「起泡法」對其進行從大到小並輸出。
#include 「iostream.h」
void bubble_sort(int *item,int count)
{
register int I,j;
int t;
for(i=0;i<count-1;i++)
for(j=count-1;j>=I;--j)
if(item[j-1]<item[j])
{t=item[j-1];item[j-1]=item[j];item[j]=t;}
}
void main()
{
int a[10];
int i;
for (i=0;i<10;i++)
cin>>a[i];
bubble_sort(a,10);
for(i=0;i<10;i++)
cout<<a[i]<<」 「;
cout<<endl;
}
第2題:選擇排序法
1、「原型」
#include 「iostream.h」
void select_sort(double *item,int count)
{
register int I,j,k;
double t;
for(i=0;i<count-1;i++) //每趟只進行一次交換
{
k=I;
for(j=i+1;j<count;++j)
if(item[k]>item[j]) k=j; //將較小的數排到前面
t=item[k];item[k]=item[i];item[i]=t;
}
}
void main()
{
double b[]={6.8,8.7,3.9,9.6,7.4,4.3,5.2,1.5,2.0};
select_sort(b,9);
for(int i=0;i<9;i++)
cout<<b[i]<<」 「;
cout<<endl;
}
2、實踐
(1)調試該「原型」,分析其執行功能,並比較其與「起泡法」排序演算法的運行時間代價(「最壞」情形)。
(2)從鍵盤輸入10個學生的「英文名」,請用「選擇排序法」對其進行從小到大並輸出。
提示:C/C++中,比較兩個字元串的大小:strcmp(str1,str2),復制字元串:strcpy(str1,str2),頭文件是:string.h
//參考答案
#include 「iostream.h」
#include 「string.h」(填空)
#include 「conio.h」
void main()
{
char item[10][21];
int I,j,k;
char t[21];
cout<<」從鍵盤輸入10個學生的英文名:」<<endl;
for(i=0;i<10;i++)
cin>>item[i];(填空)
//排序
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<10;++j)
if(strcmp(item[k],item[j])>0) k=j;
strcpy(t,item[k]);strcpy(item[k],item[i]);strcpy(item[i],t);
}
//輸出
for(i=0;i<10;i++)
cout<<item[i]<<endl;
getche();
}
第3題【《信息管理技術》機試題-條件查詢問題】:下列程序的功能是:選出5000以下符合條件的自然數。條件是:千位數字與百位數字之和等於十位數字與個位數字之和,且千位數字與百位數字之和等於個位數字與千位數字之差的10倍。計算並輸出這些四位自然數的個數cnt以及這些數的和sum。請編寫函數countValue()實現程序的要求,最後調用函數writeDat()把結果cnt和sum輸出到文件OUT13.DAT中。
部分源程序已經給出。
請勿改動主函數main()和輸出數據函數writeDat()的內容。
#include <stdio.h>
int cnt,sum;
void writeDat(); //寫盤函數的聲明
void countValue()
{ }
void main()
{
cnt=sum=0;
countValue();
printf("滿足條件的自然數的個數=%d\n",cnt);
printf("滿足條件的自然數的和=%d\n",sum);
writeDat(); //調用寫盤函數
}
void writeDat() //寫盤函數的實現
{
FILE *fp;
fp=fopen("OUT13.DAT","w");
fprintf(fp,"%d\%d\n",cnt,sum);
fclose(fp);
}
////參考答案/////////
void countValue()
{
int i,thou,hun,ten,data;
for(i=5000;i>=1000;i--)
{
thou=i/1000;
hun=i%1000/100;
ten=i%100/10;
data=i%10;
if(thou+hun==ten+data && thou+hun==(data-thou)*10)
變化的是條件!!!參考答案的其他內容都要記下來!!!
{ sum+=i; cnt++; }
}
}
要求:
(1)調試該程序。
(2)用文字說明countValue()「演算法」的控制流程。
第4題【《信息管理技術》機試題-出圈問題】:設有n個人圍坐一圈並按順時針方向從1到n編號,從第s個人開始進行1到m的報數,報數到第m個人,此人出圈,再從他的下一個人重新開始1到m的報數,如此進行下去直到所有的人都出圈為止。現要求按出圈次序每10人一組,給出這n個人的順序表。請考生編制函數Josegh()實現此功能,並調用函數writeDat()把結果p輸出到文件JOSE.DAT中。
設n=100,s=1,m=10。
(1)將1到n個人的序號存入一維數組p中;
(2)若第i個人報數後出圈,則將p[i]置於數組的倒數第i個位置上,而原來第i+1個至倒數第i個元素依次向前移動一個位置;
(3)重復第(2)步直至圈中只剩下p[1]為止。
注意:部分源程序已經給出。
請勿改動主函數main()和輸出數據函數writeDat()的內容。
#include <stdio.h>
#define N 100
#define S 1
#define M 10
int p[100],n,s,m;
void writeDat(void);
void Josegh(void)
{ }
void main()
{
m=M; n=N; s=S;
Josegh();
writeDat();
}
void writeDat(void)
{
int i;
FILE *fp;
fp=fopen("JOSE.DAT","w");
for(i=N-1;i>=0;i--)
{
printf("%4d",p[i]);
fprintf(fp,"%4d",p[i]);
if(i%10==0)
{
printf("\n");
fprintf(fp,"\n");
}
}
fclose(fp);
}
////參考答案/////////
void Josegh(void)
{
int i,j,k,s1,w;
s1=s;
for(i=1;i<=n;i++)
p[i-1]=i;//給每個人編號
for(i=n;i>=2;i--)
{
s1=(s1+m-1)%i;
if(s1==0) s1=i;
w=p[s1-1];
for(j=s1;j<=i-1;j++)
p[j-1]=p[j];
p[i-1]=w;
}
}
❹ 求高速產生隨機全排列的c(c++)演算法
我的思路是這樣的:
#include "stdafx.h"
#include<stdlib.h>
#include<time.h>
using namespace std;
void main()
{
int Array[100],i;
srand(time(NULL));
Array[0]=rand()%256;
for (i=1;i<100;i++){
Array[i]=(Array[i-1]+rand()%256);//在上一個數的基礎上加上一個隨機數
if (Array[i]>256){i--;continue;}//判斷下是不是大於256若是則重新生出
}
}
❺ 隨機演算法
一般用a=rand(n),為了防止重復用srand(time(NULL)); 很簡單的
❻ 求從n個數中抽取隨機數的c語言演算法。
int a[9][8];定義數組包含math.h time.h頭文件 運用rand()函數和系統時間用系統的時間做隨機種子。對產生的隨機數%100就能保證隨機數都<100.最後加1,EQlxCg
❼ c語言自己怎麼寫隨機函數的演算法
隨機函數一種思維是獲取電腦時間的毫秒值,再根據這個值做下處理,這樣就可以生成隨機數了。
延時函數可試下sleep函數
❽ 用C語言產生隨機數
C語言太久沒碰了,函數都不太記得了..就記個思路吧.
從題面來講..產生 數為 某范圍內的數字且不能重復.
那麼可以把這些數據先放在一個棧里.然後隨機產生一個要得到的下標...從棧里取出.
此時技術要點在於 數組的棧操作,int splice(int[] arr,int outIndex),把outIndex下標的元素移出棧,
第二點是 產生隨便下標, 產生隨機數前要 初始化 隨機種子(或叫 隨機列表)
void srand(long seed) 函數,一般都給一個時間戳作為參數,這樣就能讓程序在什麼時候運行都得到一個不一樣的隨機列表.
int outIndex = randomize(stackLength) 產生 0到stacklength-1 之間的整數,正好是棧的有效下標...然後 取棧元素 便可以得到所要的效果