討論區快速選單
知識庫快速選單
討論區最近新進100則主題 CSSLP認證,將資安落實在軟體開發中 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
單晶片亂數設計
更改我的閱讀文章字型大小
作者 : j411008k(ㄚ和)
[ 貼文 5 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/2/3 下午 11:58:01
各位朋友好:

我想請教一下,我想在單晶片裡應用到"亂數"這個程式設計,而且數值不能重複,另外數值要是可浮點數的,那須注意哪些命令或者如何設計。

PS:此程式需為C或C++,設計對象為單晶片,感謝各位朋友指導。
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 343 | 人氣 0 | 評價 1650 | 評價/貼文 4.81 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/2/4 下午 01:31:02
一般亂數產生都是產生一個一定範圍內的整數,至於浮點亂數不是個問題。
假設有一個函式 ff 可以產生 0 到 100 之間的亂數,那我只要像下面這樣就可以得到一個介於 0 到 1 之間的浮點亂數:

val = ff() / 100.0;

當然,前題是你的單晶片可以處理浮點運算。

所以,你的問題又回歸到如何產生隨機整數了!
但在繼續討論之前,我會希望你先看完下面的文章,不然後面你很可能會看不懂我在寫什麼:
http://novus.pixnet.net/blog/post/32238099-%E9%9B%BB%E8%85%A6%E7%9A%84%E9%9A%A8%E6%A9%9F%E6%95%B8%E6%98%AF%E5%A6%82%E4%BD%95%E5%81%9A%E5%88%B0%E7%9A%84%3F

我們可以先得到以下結論:
1. 真正的亂數是無法只用軟體方法算出來的,因為算得出來的東西就表示可以預測,只是多難的問題罷了!
2. 偽亂數序列總是重複的序列,只是差在重複週期有多長而已,有的產生100個亂數就重複了,有的產生10000個亂數才重複。
3. 影響一個「偽」隨機數有多「亂」的重點在於:使用的隨機數演算法、以及初始值(或稱種子)的來源。

演算偽隨機數的方法有很多種,如同上面連結所說,你甚至可以隨意自創一種,差別只在不同演算法算出來數列的可預測性以及運算速度的不同而已。
一些常見演算法可以參考下面連結:
https://zh.wikipedia.org/wiki/%E4%BC%AA%E9%9A%8F%E6%9C%BA%E6%80%A7

其中,線性同餘法是最常見的,也是最容易被預測的。
它的優點在於計算簡單、速度快,對於不涉及加密等安全性的議題上很好用,比方說計算遊戲中的砲彈落點誤差等。
這個演算法可能也是大部份程式語言中標準亂數產生函式所使用的演算法。

如果你要求亂數序列的不可預測性要高,則應該改用其他演算法,比方說梅森旋轉算法。
當然,它們比較複雜,需要的計算時間也較多。

第二個議題是偽亂數序列的週期。
但這個不難,你只要在每次產生亂數時記錄從上次初始化到現在已經產生了多少個亂數,在週期到之前重新初始化亂數種子就好了!

第二個議題是亂數種子的來源。
不管你的演算法多好,如果你設了一樣的種子,你會發現他們產生的亂數序列也是一樣的!
一般大家常常會取用當前的時間來初始化亂數種子,因為每次執行程式的時間都不一樣,所以每次生成的亂數序列也就不一樣了。
一樣的,如果你用來算猜拳遊戲該出什麼拳的話,以時間做為種子是夠用了;但如果是應用在加密等場合上,這樣的種子又太容易被猜到!
因此,亂數種子的來源又是另一個大議題。除了時間之外,許多人進可能的蒐集一些硬體雜訊,像是按鍵的按壓、環境的輻射等等。

結論是,你想要產生不可預測的隨機亂數,則最大的重點可能在於你可以從你的單晶片上蒐集到多少不可預測的硬體雜訊?
作者 : wallace_tsou(Wallace) 貼文超過200則
[ 貼文 244 | 人氣 314 | 評價 960 | 評價/貼文 3.93 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/2/4 下午 01:39:31
我以MCU工程師來發表。
使用新的32位元ARM系列MCU,內建有硬體亂數產生器,其亂數種子以內建感溫器為源。就不用去理解一堆軟體亂數理論。
至於轉成浮點數,我就取出4個byte亂數,再Cast成浮點,不用浪費時間去計算。
MCU已不像以前那樣了,是可以執行C標準函式庫。
就算沒有硬體支援,使用標準C也是可以做到的,但亂數原理還是去理解比較好。
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 343 | 人氣 0 | 評價 1650 | 評價/貼文 4.81 | 送出評價 16 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/2/4 下午 03:37:13
>至於轉成浮點數,我就取出4個byte亂數,再Cast成浮點,不用浪費時間去計算。

感覺上是很方便沒錯,但這樣產生出來的亂數可能會非常的不常態分佈!
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4464 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/2/4 下午 08:52:49
depends on c compiler & its c library
if it supports those routines , it can use following example and write some codes .
http://stackoverflow.com/questions/5289613/generate-random-float-between-two-floats
 板主 : Jammy
 > 新手入門 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 新手入門 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
新手入門
1 Raymond 900 
2 BK. 820 
3 Jasper 500 
4 太子 500 
5 Benson 410 
6 joe 400 
7 DEMO999 370 
8 青衫 300 
9 小朱 300 
10 Eric Ho 290 
新手入門
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875