<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
小遊戲中時常要用到亂數,今天就來談談這個所謂的“隨機”。
我們要使用亂數(嚴格意義上是偽隨機)的話,C++ 中就有 rand()
來提供了這一操作。
rand()
返回值是整數。在不同系統的編譯器下,返回值的範圍不同,我們姑且認為足夠我們使用。
設我們要獲取數x,逐步推導:
當x∈[0,100] 時,可以寫成 rand()%101;
當 x∈[1,100] 時,可以轉化為x′+1(x′∈[0,99]),寫成 rand()%100+1;
當x∈[l,r] 時,可以轉化為x′+l(x′∈[0,r−l]),寫成 rand()%(r-l+1)+l。
可現實總是不盡如人意:
為什麼每次隨機出來的序列都是一樣的呢?這裡我們就要講到下面的東西了
畢竟是偽隨機,所以每次生成的隨機序列需要有一個初始的隨機種子(無符號整數),srand()
提供了這一操作。
比如設定隨機種子為114514,可以寫成 srand(114514);
。
然而
這意味著種子要隨機。
time()
返回從 1970.1.1 1970.1.1 1970.1.1 至今的秒數,引數直接填 NULL
或 0 0 0(也就是空指標)即可。
設定為種子,也就是 srand(time(0));
。
效果顯著:
如果有一個陣列 a a a,如何讓其進行隨機排列呢?
C++ 有函數 random_shuffle()
。
引數和用法與 sort()
類似,直接呼叫即可。
範例程式碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,a[105]; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; } random_shuffle(a+1,a+n+1); for(int i=1;i<=n;i++) { cout<<a[i]<<' '; } return 0; }
效果:
給定邊長n,要求生成一個隨機 01 矩陣。
範例程式碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n; cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cout<<rand()%2; } cout<<endl; } return 0; }
效果:
給定n,要求生成n個區間[l,r](l≤r),並且這些區間是[1,n]的子區間。
每次分別對於l,r隨機,然後調整l,r大小位置。
範例程式碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n; cin>>n; for(int i=1;i<=n;i++) { int l=rand()%n+1,r=rand()%n+1; if(l>r) swap(l,r);//防止 l>r cout<<l<<' '<<r<<endl; } return 0; }
效果:
給定n和k,要求生成n個[0,n] 的k位浮點數(不可以有字尾0)。
分成整數部分和小數部分考慮。
整數部分生成[0,n] 的整數,小數部分生成k位 [0,9] 的數(在位數允許時,可以生成一個[0,10k−1] 的整數代替小數)。
當然,要特判整數為n的情況。若小數部分>0,就不在[0,n]內了。
處理字尾0時,只要把其存進字串處理即可。
範例程式碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,k; cin>>n>>k; for(int i=1;i<=n;i++) { int d=rand()%(n+1); cout<<d; if(d==n) { cout<<endl; continue; } string s="."; for(int j=1;j<=k;j++) { s+=(char)(rand()%10+48); } while(s[s.size()-1]=='0'&&s.size()>2) s.erase(s.size()-1);//防止字尾 0 cout<<s<<endl; } return 0; }
效果:
給定n,l,r(l,r∈Z,l≤r),要求生成n個整數x(x∈[l,r])。
可能含有負數,該怎麼辦呢?
分三類討論:
1.當l≤r≤0 時,先輸出 -
,然後生成[∣r∣,∣l∣] 範圍的整數。
2.當l≤0≤r 時,先隨機t=0或1來確定符號。
-
,生成[0,∣l∣] 的整數。3.當0≤l≤r時,直接生成[l,r] 的整數。
注意以上操作中輸出 -0
的情況要處理一下。
範例程式碼:
#include<bits/stdc++.h> using namespace std; int main() { srand(time(0)); int n,l,r; cin>>n>>l>>r; while(n--) { if(l<=r&&r<=0) { int d=rand()%(abs(l)-abs(r)+1)+abs(r); if(d) cout<<'-';//防止 -0 cout<<d; } else if(l<=0&&0<=r) { int f=rand()%2; if(f) cout<<rand()%(r+1); else { int d=rand()%(abs(l)+1); if(d) cout<<'-';//防止 -0 cout<<d; } } else cout<<rand()%(r-l+1)+l; puts(""); } return 0; }
效果:
以上就是C++遊戲教學基本技巧之隨機化詳解的詳細內容,更多關於C++隨機的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45