我想从一些(有限的)字母表中生成一个长度在1到n个字符之间的随机字符串(或一系列允许重复的随机字符串)。每个字符串的可能性应该相等(换句话说,字符串应该均匀分布)。
一致性要求意味着像这样的算法不起作用:
alphabet = "abcdefghijklmnopqrstuvwxyz"
len = rand(1, n)
s = ""
for(i = 0; i < len; ++i)
s = s + alphabet[rand(0, 25)](伪代码,rand(a, b)返回一个介于a和b之间的整数,包括每个整数的可能性相等)
此算法生成长度均匀分布的字符串,但实际分布应该向更长的字符串加权(长度为2的字符串的数量是长度为1的字符串的26倍,依此类推)。我如何才能做到这一点?
发布于 2010-06-18 09:58:37
基于我作为对OP的回复发布的评论:
我认为这是一个基数转换的练习。您只是在“基数26”中生成一个“随机数”,其中包含a=0和z=25。对于长度为n的随机字符串,生成一个介于1和26^n之间的数字。使用所选字母表中的符号,从基数10转换为基数26。
这是一个PHP实现。我不能保证这里没有一两个错误,但任何这样的错误都应该是很小的:
<?php
$n = 5;
var_dump(randstr($n));
function randstr($maxlen) {
$dict = 'abcdefghijklmnopqrstuvwxyz';
$rand = rand(0, pow(strlen($dict), $maxlen));
$str = base_convert($rand, 10, 26);
//base convert returns base 26 using 0-9 and 15 letters a-p(?)
//we must convert those to our own set of symbols
return strtr($str, '1234567890abcdefghijklmnopqrstuvwxyz', $dict);
}https://stackoverflow.com/questions/3066707
复制相似问题