Javascript 为cookie键创建随机指数值

Javascript 为cookie键创建随机指数值,javascript,string,random,pow,floor,Javascript,String,Random,Pow,Floor,使用这样的代码可以得到长度为17的字符串吗? 我们正在将cookie保存到客户端的浏览器中,然后从此浏览器获取cookie function getPartnerVisitorId() { var pvid = cookies.get('pvid') || Math.floor(Math.random() * Math.pow(10, 15)).toString(); cookies.setOnRoot('pvid', pvid, 365 * 24 * 60 * 60);

使用这样的代码可以得到长度为17的字符串吗? 我们正在将cookie保存到客户端的浏览器中,然后从此浏览器获取cookie

function getPartnerVisitorId() {
    var pvid = cookies.get('pvid') || Math.floor(Math.random() * Math.pow(10, 15)).toString();
    cookies.setOnRoot('pvid', pvid, 365 * 24 * 60 * 60);
    return pvid;
};
我们认为“pvid”的最大长度应该是16位,但有时(大约占cookie的5%)我们会得到17位长度的cookie


我们还注意到,所有奇怪的cookie都是偶数,其中大多数(75%)的最后一个数字是零

您要处理的问题与IEEE 754浮点数的性质有关-在JavaScript中用于保存
数字
,在Java和C中用于保存
,这些数字存储在一种科学符号中,以

[+/-]1.[some value]*2^[some other value]

这会得到大约15个有效的十进制数字,它们特别擅长表示2的幂

通过将
Math.random()
乘以
Math.pow(10,15)
,此方案将遇到两个问题:

  • 您的数字已用完,因此会截断底部的最后几个数字(因此,您的数字总是偶数)
  • 您试图表示10的幂,但它不能始终准确地表示(因此,您有时会得到17位数字的键)
要解决这些问题并获得所需的等长随机键,请执行两项操作:

  • Math.random()
    乘以
    Math.pow(2,x)
    (其中
    x
    是一个用于寻找正确长度的数字)-2^任何东西都可以用浮点数累加表示
  • toString()
    方法中,插入一个2的幂的整数参数(例如8或16)-这将导致数字转换为带base-8或base-16数字系统的字符串。这将防止变长关键点,也将防止舍入

var pvid=cookies.get('pvid')|| Math.floor(Math.random()*Math.pow(8,15)).toString(8)

这很有道理,thanx。但是我已经运行了以下代码'Math.floor(Math.random()*Math.pow(10,15)).toString();'经过数百万次迭代,没有得到任何17位甚至16位长度的数字。它是如何依赖于浏览器的版本或类似的东西的?对于他的问题,还有一个愚蠢的解决方案,我想这对它的问题来说已经足够好了:
Math.random().toString().substr(2,16)
@nemoino-因为这是一个根本不同的解决方案,你可以把它作为一个答案而不是一个评论。