使用马尔可夫模型生成太阳能收集的随机数
本文关键字:太阳能 随机数 马尔可 模型 | 更新日期: 2023-09-27 17:57:59
如何在C#中使用马尔可夫模型生成随机数?我在这里注意到,马尔可夫算法的几乎所有应用都是用于随机编写文本的。有没有一个源代码或教程可以让我完全理解它是如何工作的?我的目标实际上是生成随机数来模拟太阳能收集。
首先决定马尔可夫模型的深度。你看以前的数字了吗?前两个数字?前三个数字?也许更深?
其次,查看一些实际的太阳能数据,并提取一组1、2或3个数字的概率。理想情况下,你将能够获得完整的覆盖范围,但很可能会有差距。对于那些要么外推,要么放入一些平均值/随机值。
到目前为止,所有这些都是数据。
第三个生成前1、2或3个数字。从你的数据库中选择正确的组合,并随机选择一个可能的追随者。当我这样做的时候,我也有一个低概率的随机元素,这样事情就不会墨守成规。
删除1、2或3个数字中最早的元素。将其他数字下移,并在末尾添加新数字。重复此操作,直到获得足够的数据。
以下是我的1-深度马尔可夫字生成器的简短摘录,显示了数据表的一部分:
// The line addEntry('h', "e 50 a 23 i 12 o 7 @ 100") shows the the letter
// 'h' is followed by 'e' 50% of the time, 'a' 23% of the time, 'i' 12% of
// the time, 'o' 7% of the time and otherwise some other letter, '@'.
//
// Figures are taken from Gaines and tweaked. (see 'q')
private void initMarkovTable() {
mMarkovTable = new HashMap<Character, List<CFPair>>(26);
addEntry('a', "n 21 t 17 s 12 r 10 l 8 d 5 c 4 m 4 @ 100");
addEntry('b', "e 34 l 17 u 11 o 9 a 7 y 5 b 4 r 4 @ 100");
addEntry('c', "h 19 o 19 e 17 a 13 i 7 t 6 r 4 l 4 k 4 @ 100");
addEntry('d', "e 16 i 14 a 14 o 10 y 8 s 6 u 5 @ 100");
addEntry('e', "r 15 d 10 s 9 n 8 a 7 t 6 m 5 e 4 c 4 o 4 w 4 @ 100");
addEntry('f', "t 22 o 21 e 10 i 9 a 7 r 5 f 5 u 4 @ 100");
addEntry('g', "e 14 h 14 o 12 r 10 a 8 t 6 f 5 w 4 i 4 s 4 @ 100");
addEntry('h', "e 50 a 23 i 12 o 7 @ 100");
// ...
}
数据被组织为字母频率对。我用"@"字符表示"在这里选择任何字母"。您的数据将改为数字频率对。
为了选择一个输出,我读取相应的数据行并生成一个随机百分比。长时间扫描累积频率的数据,直到累积的频率超过随机百分比。这就是你选择的字母(或数字)。