我希望得到一个由随机选取的字符组成的5个字符的字符串,可用字符集为
使用JavaScript,最佳方法是什么?
[a-zA-Z0-9]
。使用JavaScript,最佳方法是什么?
[a-zA-Z0-9]
。这是我创建的方法。
它会创建一个包含大小写字母的字符串。
此外,我还包括了一个函数来创建包含字母和数字的字符串。
工作示例:
http://jsfiddle.net/greatbigmassive/vhsxs/(仅字母)
http://jsfiddle.net/greatbigmassive/PJwg8/(字母和数字)
function randString(x){
var s = "";
while(s.length<x&&x>0){
var r = Math.random();
s+= String.fromCharCode(Math.floor(r*26) + (r>0.5?97:65));
}
return s;
}
2015年7月升级版
该版本与原先功能相同,但更易理解并包含所有字母。
var s = "";
while(s.length<x&&x>0){
v = Math.random()<0.5?32:0;
s += String.fromCharCode(Math.round(Math.random()*((122-v)-(97-v))+(97-v)));
}
改进了@Andrew上面的答案:
Array.from({ length : 1 }, () => Math.random().toString(36)[2]).join('');
将随机数转换为36进制会导致不一致性,因此选择一个单独的索引来解决这个问题。您可以更改所需长度的字符串的长度。
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');
function randomString (strLength, charSet) {
var result = [];
strLength = strLength || 5;
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
while (strLength--) { // (note, fixed typo)
result.push(charSet.charAt(Math.floor(Math.random() * charSet.length)));
}
return result.join('');
}
这是最干净的状态了。它速度也很快,http://jsperf.com/ay-random-string。
strLength - 1
的随机字符串 :-/ - AlexGrafe--strLength
改为strLength--
对我来说解决了问题。 - AlexGrafestrLength--
后缀,而不是前缀。 - Fattie快速且改进的算法。不能保证均匀性(请参见注释)。
function getRandomId(length) {
if (!length) {
return '';
}
const possible =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let array;
if ('Uint8Array' in self && 'crypto' in self && length <= 65536) {
array = new Uint8Array(length);
self.crypto.getRandomValues(array);
} else {
array = new Array(length);
for (let i = 0; i < length; i++) {
array[i] = Math.floor(Math.random() * 62);
}
}
let result = '';
for (let i = 0; i < length; i++) {
result += possible.charAt(array[i] % 62);
}
return result;
}
crypto.getRandomValues
返回256个唯一值之一。因为256不能被62整除,所以得到A-H字符的概率稍微高一些。我认为最好的解决方案是像YouTube那样,只需将2个额外的字符(可能是“-”和“_”)添加到字符集中。总之,非常出色 - 这个答案需要更多的支持 :) - TeWu虽然这个答案与其他答案几乎相似,但它的不同之处在于它使用了:
repeat
创建 5 个字符(可以概括为 n
)/./g
的正则表达式替换这五个字符let ans = "x".repeat(5)
.replace(/./g, c => "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[Math.floor(Math.random() * 62) ] );
console.log(ans);
function randStr(len) {
let s = '';
while (s.length < len) s += Math.random().toString(36).substr(2, len - s.length);
return s;
}
// usage
console.log(randStr(50));
这个函数的好处是可以获取不同长度的随机字符串,并且确保字符串的长度。
function randStr(len) {
let s = '';
while (len--) s += String.fromCodePoint(Math.floor(Math.random() * (126 - 33) + 33));
return s;
}
// usage
console.log(randStr(50));
function randStr(len, chars='abc123') {
let s = '';
while (len--) s += chars[Math.floor(Math.random() * chars.length)];
return s;
}
// usage
console.log(randStr(50));
console.log(randStr(50, 'abc'));
console.log(randStr(50, 'aab')); // more a than b
var possible
,那么函数的结果将更具可配置性,这将很酷。 - Denis.Sabolotni您可以循环遍历一个项目数组,并将它们递归地添加到字符串变量中,例如,如果您想要一个随机的DNA序列:
function randomDNA(len) {
len = len || 100
var nuc = new Array("A", "T", "C", "G")
var i = 0
var n = 0
s = ''
while (i <= len - 1) {
n = Math.floor(Math.random() * 4)
s += nuc[n]
i++
}
return s
}
console.log(randomDNA(5));
这个小巧的技巧怎么样?
var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var stringLength = 5;
function pickRandom() {
return possible[Math.floor(Math.random() * possible.length)];
}
var randomString = Array.apply(null, Array(stringLength)).map(pickRandom).join('');
你需要在那里使用 Array.apply
来欺骗空数组成为一组未定义的数组。var randomString = Array.from({ length: stringLength }, pickRandom).join('');
entropy-string
生成随机ID,在500万个字符串中具有小于1兆分之一的重复几率:import {Random, Entropy} from 'entropy-string'
const random = new Random()
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"44hTNghjNHGGRHqH9"
entropy-string
默认使用包含32个字符的字符集。还有其他预定义的字符集,您也可以指定自己的字符集。例如,使用十六进制字符生成与上述相同熵值的 ID:
import {Random, Entropy, charSet16} from './entropy-string'
const random = new Random(charSet16)
const bits = Entropy.bits(5e6, 1e12)
const string = random.string(bits)
"27b33372ade513715481f"
请注意,由于使用的字符集中字符总数的差异,字符串长度存在差异。指定数量的潜在字符串中重复的风险相同,但字符串长度不同。最好的是,重复的风险和潜在字符串数量是明确的,不需要猜测字符串长度。
nanoid
比entropy-string
更受欢迎,而且对于我的目的来说似乎同样好。 - Altay_H