【问题标题】:Cross browser random string (Math.random()*1e32).toString(36)跨浏览器随机字符串 (Math.random()*1e32).toString(36)
【发布时间】:2015-12-14 01:11:28
【问题描述】:

我使用(Math.random()*1e32).toString(36) 作为一个简单的随机字符串生成器。它非常简单,效果很好,可以满足我的需求(用于 id 的时间随机数等)

在 chrome、safari、firefox 和 ie 中,Math.random()*1e32 生成的数字如下:8.357963780872523e+31 :-)

  • 在 chrome、safari 和 firefox 中,此类数字被转换为字符串 (8.357963780872523e+31).toString(36) -> 221fr2y11ebk4cog84wok 这正是我想要的。
  • 但是在 ie11 中,字符串结果是6.936gwtrpf69(e+20)

如何以跨浏览器的方式从8.357963780872523e+31获取相同的字符串221fr2y11ebk4cog84wok

顺便说一句:我从这个帖子中得到了这个随机字符串的想法:Random alpha-numeric string in JavaScript?

【问题讨论】:

  • .toFixed(20) 是什么意思?
  • 你需要固定数量的字符吗?
  • 并非如此。我只是想减少与其他外部随机id生成器发生冲突的可能性(不知道用了什么算法)

标签: javascript


【解决方案1】:

请记住,Math.random() 返回一个介于 0 和 1(不包括)之间的值,并且 JavaScript 中的数字根据 IEEE-754 具有 53 位尾数,获取随机整数的安全方法是

Math.random() * Math.pow(2, 54)

所以一个随机的字母数字字符串可以从

(Math.random() * Math.pow(2, 54)).toString(36)

请注意,不能保证字符数,根据随机值的数量级,字符数可能介于 1 到 11 之间。

【讨论】:

  • 很有意义。所以你是说乘以*1e32 太多了?
  • @nacho4d 1e32 实际上是 10³²,太大了。
【解决方案2】:

据我所知,您不需要将随机数乘以这么大的数字。试试这个:

Math.random().toString(36).slice(2)

够了吗?这是一个稍短的字符串,但在所有浏览器中都是一致的(我测试过)。

【讨论】:

  • 随机字符串不应包含 .( 或其他字符,因为它们将被用作:$('#' + randomID) 或更复杂的 '#table tr[data-iid=' + randomID +']',这可能会导致问题
  • 使每个生成的字符串都以0.开头
  • 这可能是一个选项Math.random().toString(36).replace('.', '_')
  • Math.random().toString(36).slice(2)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 2023-03-20
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多