首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何生成长度不超过一定长度的随机字符串?

如何生成长度不超过一定长度的随机字符串?
EN

Stack Overflow用户
提问于 2010-06-18 09:37:33
回答 5查看 5.3K关注 0票数 16

我想从一些(有限的)字母表中生成一个长度在1到n个字符之间的随机字符串(或一系列允许重复的随机字符串)。每个字符串的可能性应该相等(换句话说,字符串应该均匀分布)。

一致性要求意味着像这样的算法不起作用:

代码语言:javascript
运行
复制
alphabet = "abcdefghijklmnopqrstuvwxyz"
len = rand(1, n)
s = ""
for(i = 0; i < len; ++i)
    s = s + alphabet[rand(0, 25)]

(伪代码,rand(a, b)返回一个介于ab之间的整数,包括每个整数的可能性相等)

此算法生成长度均匀分布的字符串,但实际分布应该向更长的字符串加权(长度为2的字符串的数量是长度为1的字符串的26倍,依此类推)。我如何才能做到这一点?

EN

Stack Overflow用户

发布于 2010-06-18 09:58:37

基于我作为对OP的回复发布的评论:

我认为这是一个基数转换的练习。您只是在“基数26”中生成一个“随机数”,其中包含a=0和z=25。对于长度为n的随机字符串,生成一个介于1和26^n之间的数字。使用所选字母表中的符号,从基数10转换为基数26。

这是一个PHP实现。我不能保证这里没有一两个错误,但任何这样的错误都应该是很小的:

代码语言:javascript
运行
复制
<?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);
}
票数 4
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3066707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档