【问题标题】:Shortest code to get random string of numbers and letters [duplicate]获得随机数字和字母串的最短代码[重复]
【发布时间】:2014-01-10 19:13:21
【问题描述】:

我现在使用Math.random(),它返回一些像0.7183306051883847 这样的数字。 这个函数有一些不好的方面:

  • 0.开头

  • 没有设置数字符号长度的选项

  • 没有向字符串添加字母的选项

我想知道,生成字符串的最短代码是什么(预期字符长度 - 例如 6)?

  1. 2en81u
  2. 39438s
  3. ldksfn

谢谢。

【问题讨论】:

  • 对不起,您是在找codegolf.stackexchange.com吗?
  • @elclanrs 答案在问题内
  • @Steve:“你想要什么”和“你试过什么”不是一回事

标签: javascript jquery random


【解决方案1】:

这应该是最短的。如果您需要大写,请在尾部添加一个额外的 .toUpperCase() 调用。

Math.random().toString(36).substring(3,9)

更新

这个版本有点长,但确实避免了一些特殊的有理数可能不够长的问题。

(+new Date * Math.random()).toString(36).substring(0,6)  

【讨论】:

  • @Jonny5 啊哈。这似乎是一种被广泛使用的技能,可以极快地生成随机密码。
  • 嗯,是第一个,谷歌发现 :-) 来自链接线程的 gertas 评论可能已集成到此解决方案中。
  • 这不可能在所有情况下都有效。 Math.random() 可以返回该范围内的任何浮点值,包括 0.5、0.25 等在字符串化时没有足够数字的值。 toString() 不会为您添加额外的 0。正确的做法是使用值本身——而不是它的字符串表示——适当地缩放和四舍五入,来索引一个字符数组。
  • @LeeDanielCrocker 我有了一个新想法,即乘以一个大整数(时间戳)。
【解决方案2】:
function randomString() {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 8;
    var randomstring = '';
    for (var i = 0; i < string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars[rnum];
    }
    return randomstring;
}

【讨论】:

  • chars.substring(rnum, rnum + 1) => chars[rnum]
  • 谢谢,但是这个函数太长了。
  • @Steve:请解释一下一段代码怎么会“太长”?
  • 我不明白。 “最短的代码逻辑”从何而来?这是一个很好的功能,返回重复单词的机会非常低。
  • 关于,当你需要 60 个字符长的字符串时,接受的答案会更长,而且这仍然合适,我给这个答案投了票。
【解决方案3】:

btoa 做得很好,但不是特别好:

> btoa(Math.random())
"MC43MzU0MzQ4NTk5OTEwNzM2"
> btoa(Math.random())
"MC44MTk2NzE0OTIzMjUxNDI="
> btoa(Math.random())
"MC41NDgwMzgxMzMxODcyMTk1"
> btoa(Math.random())
"MC4wNTk4NDc1NDIzMTc1ODQxNg=="
> btoa(Math.random())
"MC41NjA1NzYxNTEzNTc5NjM3"
> btoa(Math.random())
"MC4xMTA5MzY5ODY5ODA5NTk3Nw=="
> btoa(Math.random())
"MC42NDgwNzM5NjY2MTQ5MDI="
> btoa(Math.random())
"MC4zMTkzNTM2OTQzMjkwMzgyNg=="
> btoa(Math.random())
"MC4yOTU2OTgyOTE4NTQ5MzI5"
> btoa(Math.random())
"MC44ODc3MDEzNjQ0NjY5MjA1"

注意它们都是如何以MC4 开头的,因为Math.random().toString() 总是以0. 开头

【讨论】:

  • 末尾有不需要的== 和大写字母。
  • @steve: .toLower().replace(/=/g, '')
  • 另外,ie9不支持btoa,只有ie10+
【解决方案4】:

获取将转换为随机字符串的整数数组,如下所示:

var myAscii = [],
    someAscii;
for (var i = 0; i < 5; i +=1) {
    someAscii = Math.floor(Math.random() * (90 - 65)) + 65; // This gives you a random number between 65 and 90, which is the upper case A-Z. Adapt it to your stuff.
    myAscii.push(someAscii);
}
var randomString = String.fromCharCode.apply(someAscii);

无论如何,按照相关答案的建议,获取包含所有所需字符的字符串并执行随机提取是一种更简单的方法。

【讨论】:

  • 永远不要将变量命名为char
  • 其实我不需要 maxNumber 选项,我需要 maxSymbols 选项
  • @thefourtheye:为什么不呢?
  • fromCharCode 什么都不是,因为它不会给出具有预期符号长度的随机字符串
  • 不起作用。为什么要将 var someAscii 的最后一个值传递给 String.fromCharCode?​​span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2013-08-06
  • 2011-06-18
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多