不一样的随机数生成方法(C/C++)
在網上查隨機數生成,大家基本都是大同小異的,而且還不是很方便(這個如果你只是想要生成一個隨機數什么的,那也無所謂,還能湊合著用那種方法)。
用C++寫的,但是C要用就把 ctime寫成time.h ,cstdlib寫成stdlib.h
C++的隨機數生成本質上是用C的庫實現的,你看庫名字就知道了…
但是不夠好的是,如果如果我要生成多個隨機數的時候,那么我就要設置一個種子,srand,一般呢,就是用時間去波動它。導致時序不同的地方生成一個的隨機數。
一般代碼如下:(熟手的話,很容易就打完下面的代碼了)
但是仔細看的話,發現這樣其實是不夠好的
這個不夠好,是在代碼格式上的。
要是進行一個大的規模的的程序。你放一個種子在main函數或者其他什么函數中,這樣肯定是不好的嘛!(在邏輯上過不去,打碼久了就能很容易體會到這一點)
這樣封裝起來就不夠嚴密了嘛。
所以呢?好的解決方法是什么呢?
我想到了一個,就是構建一個類。
為什么要構建類呢?
對于每一個類,都可以在構造函數中構建一次隨機數種子。
這樣,由于一個隨機數種子會對應一個隨機數。再由于時間在波動,所以,就可以更新隨機數。
同樣可以增加代碼的重用。可以說是一個非常好的程序員思維。
舉個反例,一般對隨機數不太熟的人都會遇到生成的隨機數是相等的
典型錯誤就包括下面這種(下面代碼確保了重用但是…)
雖然你確實生成了一個隨機數,但是不得不說的是,你每次生成的隨機數都是一樣的…
像上面那個代碼運行的結果,每次都可能是1到5之間的任意的一個數,但輸出的這個10個數都是一樣的…對比第一代碼,可以看出srand的位置的不同(雖然長得有點像)
但是用類就沒有這方面的考慮了。
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; class RandomNumber{ public:RandomNumber(){srand(time(0));}int get(int begin = 0, int end = 1){return rand()%(end-begin+1)+begin;} }; int main(){RandomNumber r,t;for (int i = 0; i < 10; ++i) {cout << r.get(1, 5)<<" "<< t.get(1, 5)<< endl;} }為了確保自己設計沒有問題,我還特意寫了兩個變量來運行。
這樣說可以做了一個重用的隨機數了。
(而我這個代碼,就有點生成器的味道了(接觸過Python的朋友應該能感受到))
要是有小哥哥愿意做一個輸入流,這樣就可以做一個很酷的像int一樣的類,直接cout,可以說是非常酷了。
總結
以上是生活随笔為你收集整理的不一样的随机数生成方法(C/C++)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [深搜回溯]24点
- 下一篇: Python爬虫图形界面封装版本