Re: [問題] 平均的亂數產生數字個數 C++[新問題]

看板C_and_CPP作者 (非天夜翔)時間13年前 (2012/05/02 19:11), 編輯推噓1(107)
留言8則, 3人參與, 最新討論串2/7 (看更多)
先問個問題,來做個初步了解, 在紙上操作的時候, 當有 {4, 5, 9, 10} 四種數字可以產生 可產生的數字平均值為 (4+5+9+10)/4 = 7 設定倍數為 0.9 設定產生數量為 100 你是希望 (1) 產生的所有亂數平均為 7*0.9 = 6.3 (2)-1 每一種數字只能最多有 100/4 = 25 個 (2)-2 每一種數字恰有 100/4 = 25 個 A : (1) 成立 B : (2)-? 成立 C : (1) 和 (2)-? 都成立 還是其它種需求 說真的我看完你的描述, 實在難以理解你的需求。 請先以紙上操作的方式, 來說明你所期望的目標。 ------------------------------------------------------------------------------- 首先不考慮如何產生亂數這部分如何實做, 請先給予幾個範例說明你期待達成的目標, 不然實在很難給你想法來實作所提的內容。 /////////////////////////////////////////////////////////////////////////////// 當在 {4, 5, 9, 10} 這個亂數可用範圍, 第一部分: 當所乘的倍數為 1, 產生 200 個亂數。 你所期望的螢幕顯是的樣子為何? 一、限定產生數字總個數 200 個(genSize),每種數字 各 (200/4 = 50) 個, 出現順序隨機 如: 4,4,5,5,5,5,10,10,5,5,9,9,9,9,9,9, ..... 共計 4 有 50 個 5 有 50 個 9 有 50 個 10 有 50 個 總平均為 7,總個數 200 個 二、限定產生數字總個數 200 個(genSize),不限定 每種數字可用的個數, 出現順序隨機 如:(A) 4,10,4,4,10,4,10,10,10,10,..... 共計 4 有100 個 10 有100 個 總平均為 7,總個數為 200 個 (B) 5,5,5,5,5,5,9,9,9,9,9,5,9,5,9,... 共計 5 有100 個 9 有100 個 總平均為 7,總個數為 200 個 (C) 4,5,10,5,9,9,5,5,5,10,9,9,9,10,4,4,4,5,5,10,10,10,.... 共計 4 有 85 個 5 有 15 個 9 有 15 個 10 有 85 個 總平均為 7,總個數為 200 個 (A)(B)(C)任一種均可行 三、不限定產生數字總個數(genSize),限定 每種數字 個數相同,出現順序隨機 四、不限定產生數字總個數(genSize),不限定 每種數字 個數是否相同,出現順序隨機 五、或者是其他類型的需求 ******************************************************************************* 第二部分: 當所乘的倍數為 0.9, 產生 200 個亂數, 你所期望的螢幕顯示的樣子為何? 一、限定產生數字總個數 200 個(genSize),不限定 每種數字可用的個數, 出現順序隨機 如:(A) 4,10,4,4,10,4,10,10,5,5,10,10,5,5..... 共計 4 有120 個 5 有 4 個 10 有 76 個 總平均為 6.3,總個數為 200 個 (B) 5,5,10,10,5,4,5,10,5,5,4,4,4,4,4,5,4,5,4,10,10... 共計 4 有100 個 5 有 28 個 10 有 72 個 總平均為 6.3,總個數為 200 個 (C) 4,5,10,5,5,5,9,5,10,9,9,9,10,4,4,9,9,4,5,5,10,10,10,.... 共計 4 有100 個 5 有 26 個 9 有 10 個 10 有 64 個 總平均為 6.3,總個數為 200 個 (A)(B)(C)任一種均可行 二、或是其他種類型的需求 ------------------------------------------------------------------------------- 但是就原文所表達的,我的理解如下: 並沒有提到每種數字要一樣多這回事, 只要輸出的數字平均為 6.3 就好。 但是以文後補充的部分, 卻又必須要達成其他特定條件"不能超過", 也說明的很模糊, 原文本來只有提到亂數可用數字為 {1,2,3} 共計 3 種數字 為什麼要不能超過 (100 / 4 = 25),而不是 (100 / 3 = 33.333) 100 所要除的 `4' 這個數字到底哪來的。 ------------------------------------------------------------------------------- int SetSize; // 可出現數的集合數量 ex: 4 int NumSet[SetSize]; // 數字集合 ex:{4,5,9,10} double orgAvg = averege(NumSet,SetSize); // 原始平均數 ex: 7 double cofficent; // 設定倍數 ex: 0.9 double newAvg = orgAvg * cofficent; // 需求平均數 ex: 6.3 int genSize; // 產生數的數量 ex: 200 ------------------------------------------------------------------------------- ※ 引述《bernachom (Terry)》之銘言: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 問題(Question): 請教一下 我先說明一下我的問題 我現在有3個數字亂數產生 最少產生1個,最多產生3個 EX: 1+rand()%(3); 然後我平均亂數產生的數字要是這三個數字的平均 也就是說 1+rand()%(3); 可能產生的數字有1,2,3 平均就是(1+2+3)/3 = 2 那我平均亂數產生的數字長期平均下來要是2 然後這個平均可能會是變動的 例如說,我可能會乘上0.9, 0.8, 0.7...之類的 假如(1+2+3)/3 = 2,我乘上0.8之後,變成了1.6 那我產生的亂數長期平均下來也要是1.6 不知道各位前輩有沒有什麼想法 我目前沒有辦法做到這個樣子 只能做到 我不用亂數產生 我每次的輸入都是2 然後如果要滿足1.6的話 ex:「(1+2+3)/3 = 2,我乘上0.8之後,變成了1.6」 就是用亂數機率的方法,有10分之6的機率會是2,另外10分之4的機率會是1 例如產生出來可能會是這個樣子: 2 2 2 2 2 2 1 1 1 1 這樣子平均就是1.6了 但是這也只是兩個數字2和1的組合而已 不知道如果用3個數字要如何達成... 希望前輩們提供一些想法 如果有說明不清楚的地方我再補充 謝謝 == 方法有想到了,我先測試看看 到時後再說明 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.136.149.125

04/27 22:38,

04/27 22:41,
配置空間 catch填滿 效率我不知道
04/27 22:41

04/27 22:41,
謝謝您,我研究一下
04/27 22:41

04/27 22:41,
不過E大,我剛才跑了一下,似乎還是會超過
04/27 22:41

04/27 22:42,
感覺比較有效率一些,我在想一下如何不超過..
04/27 22:42

04/27 22:43,
何謂「超過」?
04/27 22:43
就是說 如果我要產生100個,那每個數字就會出現25次(100/4 =25) 那如果產生的數字為26次或以上,那就是超過了

04/27 22:44,
oh,在第一個for loop 裡面直接做 if(freq[rnd-LOW]>xxxx)
04/27 22:44

04/27 22:44,
break; 應就是你要的了。
04/27 22:44
謝謝您,我試試看 ※ 編輯: bernachom 來自: 140.136.149.125 (04/27 22:45)

04/27 22:50,
加了之後好像還是沒有辦法不超過,我先回家,回家再試..
04/27 22:50

04/27 22:50,
謝謝了
04/27 22:50

04/27 23:08,

04/27 23:12,
先把數字放到4個籃子裡,再一一拿出來。拿完的籃子丟掉。
04/27 23:12

04/28 00:03,
謝謝您,我看一下,好有趣的想法。
04/28 00:03

04/28 01:05,
直接宣告一個ARRAY SIZE = 你要產生的個數
04/28 01:05

04/28 01:06,
然後把1 2 3 4 填進去 再對每個元素作隨機交換
04/28 01:06

04/28 01:07,
假設SIZE = 100 直接填入25個1 25個2 25個3 25個4做交換
04/28 01:07

04/28 01:11,
謝謝您,我想一下
04/28 01:11
※ 編輯: bernachom 來自: 114.42.105.241 (04/28 03:19)

04/28 04:22,
C++有random_shuffle
04/28 04:22

04/28 04:31,

04/28 04:31,
每4個不會重複的寫法
04/28 04:31
※ 編輯: bernachom 來自: 114.42.118.109 (04/29 01:31) ※ 編輯: bernachom 來自: 114.42.118.109 (04/29 02:43)

04/29 02:53,
考慮均勻結果的話,辦不到。但確實有方法可指定<不很勻>
04/29 02:53

04/29 03:13,
好像真的是像E大您說的...冏
04/29 03:13
-- 渴望飛翔在自由中, 期望逃離這拘束的現實, 一切都讓他隨著而去, 獨自躲在黑暗空氣中, 舔舐被狠狠撕裂的傷口。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.164.92.116

05/03 04:44, , 1F
原文有換過問題重新提問,故原敘述已經看不到了.而關於您
05/03 04:44, 1F

05/03 04:45, , 2F
文中第二部份所述,目前大概沒簡單方法在符合均勻性下完成.
05/03 04:45, 2F

05/03 04:47, , 3F
若c大對於基於平均值有其見解或演算法,也請不吝賜教。
05/03 04:47, 3F

05/03 11:35, , 4F
"均勻結果"要的是每種數字個數均相同嗎???
05/03 11:35, 4F

05/03 12:30, , 5F
謝謝csihcs,是種數字個數均相同
05/03 12:30, 5F

05/03 12:30, , 6F
不過我覺的應該也是做不到,我在想想別的辦法..
05/03 12:30, 6F

05/03 13:38, , 7F
假設共n個可能,均勻指的是,這n個可能出現機率相同,而不是
05/03 13:38, 7F

05/03 13:38, , 8F
某些解出現機率較高。
05/03 13:38, 8F
文章代碼(AID): #1FeOREJH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FeOREJH (C_and_CPP)