|
|
1
11
您需要做的是将长度和字符串生成为两个不同的步骤。您需要首先使用加权方法选择长度。可以计算给定长度的字符串数
一旦有了长度,就可以像上面那样生成字符串。 |
|
2
7
好吧,一个字符串有26种可能,26 二 对于2个字符的字符串,等等,最多26个 二十六 26个字符字符串的可能性。 这意味着(n)字符串的可能性是(n-1)字符串的26倍。你可以用这个事实来选择你的长度:
我在上面的代码中使用27,因为从“ab”中选择字符串的总样本空间是26个1字符的可能性,26个 二 两个字符的可能性。换句话说,这个比率是1:26,所以1个字符的概率是1/27(而不是我第一次回答的1/26)。
这个解决方案不是
很完美
既然你打电话来
如果你能限制最大尺寸
一旦你有了长度,我将使用你当前的算法来选择实际的字符来填充字符串。 进一步解释:
假设我们的字母表只包含“AB”。长度为3的可能设置为
14是神奇的数字:它是所有2的总和
n
n=1到最大长度。所以,测试上面的伪代码
因此,在该代码中,最终循环的第一次迭代将退出
否则,
然后,最终循环的第二次迭代将退出
否则,
然后,最终循环的第三次迭代将退出
回想起来,第二种解决方案有点像噩梦。在我个人看来,我会选择第一种解决方案,因为它很简单,并且避免了出现大量数据的可能性。 |
|
|
3
4
根据我发表的评论作为对OP的回复:
这是一个php实现。我不能保证这里没有一两个错误,但是这样的错误应该是很小的:
|
|
|
4
4
不要选择均匀分布的长度,而是根据给定长度的字符串数对其进行加权。如果你的字母表是M码,就有M码 X 尺寸为x和(1-m)的字符串 N+ 1 )/(1-m)长度不超过n的字符串。选择长度为x的字符串的概率应为m X *(1-m)/(1-m N+ 1 ) 编辑: 关于溢出-使用浮点而不是整数将扩展范围,因此对于26个字符的字母表和单精度浮点,直接权值计算不应溢出n<26。 一种更健壮的方法是迭代地处理它。这也应尽量减少底流的影响:
为了通过计算更少的随机数来提高效率,我们可以通过在多个位置拆分间隔来重用它们:
|
|
|
5
2
编辑:这个答案不太正确。见底部的反证。我暂且不谈,希望有人能想出一个能修复它的变种。 不需要分别计算长度就可以做到这一点,正如其他人所指出的,这需要将一个数提升到一个大的幂,而且在我看来,这通常是一个混乱的解决方案。
证明这是正确的有点困难,我不确定我是否相信我的解释力能把它说清楚,但请容忍我。出于解释的目的,我们最多生成长度为
首先,假设你有一个
现在,我们可以递归地应用它。生成k
钍
字符串的字符,我们首先尝试在
如果你怀疑这个函数的一致性,你可以尝试反驳它:建议一个字符串,它有两种不同的生成方法,或者没有。如果没有这样的字符串-唉,我没有这一事实的有力证明,尽管我相当肯定这是真的-并且考虑到各个选择是一致的,那么结果还必须选择任何具有一致概率的字符串。 正如我们所承诺的,与迄今为止发布的所有其他解决方案不同,不需要将数字提升到大的幂;不需要任意长度的整数或浮点数来存储结果,并且有效性,至少在我看来,是相当容易证明的。到目前为止,它比任何完全指定的解决方案都要短。;) 如果有人想提供函数一致性的可靠证明,我将非常感激。 编辑:反证,朋友提供:
|
|
|
6
0
编辑:我忘了禁止0长度的字符串,这将需要更多的代码,我现在没有时间添加。 编辑:考虑到我的答案没有扩展到大N(需要很长时间才能幸运地找到一个可接受的字符串),我更喜欢PaxDiablo的答案。代码也少了。 |
|
|
7
0
我个人会这样做:
假设你的字母表
L | Z -------------------------- 1 | 26 2 | 676 (= 26 * 26) 3 | 17576 (= 26 * 26 * 26) ……等等。
假设你想要的最大长度是
(1 - (Z ^ (N + 1))) / (1 - Z)
我们称这个值为
(Z ^ L) / S 好吧,好吧。这一切都很好,但是我们如何在非均匀概率分布下生成一个随机数呢? 简单的回答是:你不需要。找个图书馆来帮你。我主要在.net中开发,所以我可能会转向 Math.NET 。 也就是说,其实不是 所以 很难想出一个简单的方法来自己做这件事。 有一种方法:使用一个生成器,在已知的 制服 分布,并根据所需分布在该分布中的大小指定范围。然后通过确定生成器所属的范围来解释生成器提供的随机值。 下面是一个用c表示的实现这个想法的方法的示例(滚动到底部,例如输出):
|
|
|
8
0
我的想法是: 有1-n个长度的字符串。有26个可能的1个长度的字符串,26*26个2个长度的字符串等等。 您可以找出每个长度字符串占可能字符串总数的百分比。例如,单个长度字符串的百分比如下 ((26/(全部长度的可能字符串总数)*100)。 类似地,您可以找出其他长度字符串的百分比。 将它们标记在1到100之间的数字行上。即假设单长字符串的百分比为3,双长字符串的百分比为6,则数字行单长字符串介于0-3之间,而双长字符串介于3-9之间,依此类推。 现在取一个介于1到100之间的随机数。找出这个数的范围。我的意思是假设你随机选择的数字是2。现在这个数字在0到3之间,所以选择1个长度的字符串,或者如果选择的随机数是7,那么选择双长度的字符串。 以这种方式,您可以看到每个选择的字符串的长度将与该长度字符串占所有可能字符串总数的百分比成比例。 希望我明白了。 免责声明:除了一两个解决方案,我没有经历过以上的解决方案。因此,如果它与某个解决方案相匹配,那纯粹是一个机会。 同时,我欢迎所有的建议和正面的批评,如果我错了,我会纠正我。 感谢和尊敬 马维亚 |
|
|
9
0
马蒂厄:你的想法行不通,因为带空格的字符串仍然更有可能被生成。在您的例子中,如果n=4,则可以将字符串“a b”生成为“a”+“b”+''+''+''或'+“a”+“b”+'',或其他组合。因此,并非所有的弦都有相同的出现机会。 |