根据使用频率随机生成字母?

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.00001或更低),则不理想.我想这取决于你需要什么. (2认同)

Car*_*icz 5

我要做的是将相对频率缩放为浮点数,使其总和为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之间的随机数,并在数组中进行二进制搜索,以获得小于随机数的第一个数字.然后在那个位置挑选信件.完成.