Tom*_*m R 10 java random algorithm pseudocode
如何根据普通语音中的使用频率随机生成字母?
任何伪代码都很受欢迎,但Java中的实现会非常棒.否则只是朝正确的方向戳一下会很有帮助.
注意:我不需要生成使用频率 - 我确信我可以很容易地查看它.
Mar*_*ers 18
我假设您将频率存储为0到1之间的浮点数,总计为1.
首先,您应该准备一个累积频率表,即该字母的频率和它之前的所有字母的总和.
为简化起见,如果从这个频率分布开始:
A 0.1
B 0.3
C 0.4
D 0.2
Run Code Online (Sandbox Code Playgroud)
您的累积频率表将是:
A 0.1
B 0.4 (= 0.1 + 0.3)
C 0.8 (= 0.1 + 0.3 + 0.4)
D 1.0 (= 0.1 + 0.3 + 0.4 + 0.2)
Run Code Online (Sandbox Code Playgroud)
现在生成一个介于0和1之间的随机数,并查看该列表中该数字所在的位置.选择累积频率最小的字母大于随机数.一些例子:
比如你随机选择0.612.这介于0.4和0.8之间,即B和C之间,所以你选择C.
如果你的随机数是0.039,那就是在0.1之前,即在A之前,所以选择A.
我希望这是有道理的,否则请随意要求澄清!
dan*_*ben 11
一种快速的方法是生成一个字母列表,其中每个字母根据其频率出现在列表中.比如说,如果25.6%的时间使用"e",而你的列表长度为1000,那么就会有256"e".
然后你可以通过使用(int) (Math.random() * 1000)生成0到999之间的随机数从列表中随机选择点.
我要做的是将相对频率缩放为浮点数,使其总和为1.0.然后我会创建一个每个字母累积总数的数组,即必须首先获得该字母的数字以及所有那些"低于"它的数字.假设A的频率为10%,b为2%,z为1%; 然后你的表看起来像这样:
0.000 A ; from 0% to 10% gets you an A
0.100 B ; above 10% is at least a B
0.120 C ; 12% for C...
...
0.990 Z ; if your number is >= 99% then you get a Z
Run Code Online (Sandbox Code Playgroud)
然后你自己生成一个介于0.0和1.0之间的随机数,并在数组中进行二进制搜索,以获得小于随机数的第一个数字.然后在那个位置挑选信件.完成.