用Java语言中的Math随机生成大数

时间:2018-12-22 08:46:34

标签: javascript

我需要使用Math.random生成26位数字,但是当我使用此代码时: Math.floor(Math.random() * 100000000000000000000000000) + 900000000000000000000000000 我得到9.544695043285823e+26

3 个答案:

答案 0 :(得分:1)

JavaScript(以及许多其他语言)中的浮点数只能包含about 15.955 digits,而不会降低精度。对于更大的数字,您可以查看JS库,或将几个数字连接为字符串。例如:

#include<stdio.h>
#include<string.h>

int main() {
  char first[25], second[25];
  int length1, length2;
  printf("Enter the first and the second string: ");
  scanf("%s %s", first, second);
  length1 = strlen(first);
  length2 = strlen(second);
  order(first, second);
  return 0;
}

int order(char *first, char *second) {
  int i;
  for (i = 0; first[i] && second[i] && first[i] == second[i]; i++)
    if (first[i] && second[i]) {
      return 1;
    } else
      return 0;
}

答案 1 :(得分:0)

如果我使用6十亿分之一的LG(约300万中的7,290万),但是当我切换到10百亿时,它像是10 ^ 999-99999 + 26,就像9-9-9-9-googolplex等于0 googolplex

答案 2 :(得分:0)

现代浏览器支持 BigIntbigint 原始类型,我们可以将它与包含 8 个字节的随机生成数组结合起来(bigint 的大小为 8 个字节(64 位) ).

1.生成随机 BigInt 性能明智

我们可以生成一个长度为 16 个字符的随机十六进制字符串并将其直接应用于 BigInt

const hexString = Array(16)
  .fill()
  .map(() => Math.round(Math.random() * 0xF).toString(16))
  .join('');

const randomBigInt = BigInt(`0x${hexString}`);

// randomBigInt will contain a random Bigint

document.querySelector('#generate').addEventListener('click', () => {
  const output = [];
  let lines = 10;

  do {
    const hexString = Array(16)
      .fill()
      .map(() => Math.round(Math.random() * 0xF).toString(16))
      .join('');
    const number = BigInt(`0x${hexString}`);
 
    output.push(`${
        number.toString().padStart(24)
      } : 0x${
        hexString.padStart(16, '0')
      }`);
  } while (--lines > 0);

  document.querySelector('#numbers').textContent = output.join('\n');
});
<button id="generate">Generate</button>
<pre id="numbers"><pre>

3.从随机字节数组生成随机 BigInt

如果我们想要使用 Uint8Array 或者我们想要更多地控制位操作,我们可以将 Array.prototype.fillArray.prototype.map 结合起来生成一个包含 8 个随机字节数值的数组(< strong>请注意,这比上述方法慢 50% 左右):

const randomBytes = Array(8)
  .fill()
  .map(() => Math.round(Math.random() * 0xFF));

// randomBytes will  contain something similar to this:
// [129, 59, 98, 222, 20, 7, 196, 244]

然后我们使用 Array.prototype.reduce 来初始化一个零值的 BigInt 并将每个随机字节值左移 位置 X 8 位 并应用 按位或 em> 到每次 reduce 迭代的当前值:

const randomBigInt = randomBytes
  .reduce((n, c, i) => n | BigInt(c) << BigInt(i) * 8n, 0n);

// randomBigInt will contain a random Bigint

生成 10 个随机 BigInt 值的工作示例

document.querySelector('#generate').addEventListener('click', () => {
  const output = [];
  let lines = 10;

  do {
    const number = Array(8)
      .fill()
      .map(() => Math.round(Math.random() * 0xFF))
      .reduce((n, c, i) => n | BigInt(c) << BigInt(i) * 8n, 0n);
 
    output.push(`${
        number.toString().padStart(24)
      } : 0x${
        number.toString(16).padStart(16, '0')
      }`);
  } while (--lines > 0);

  document.querySelector('#numbers').textContent = output.join('\n');
});
<button id="generate">Generate</button>
<pre id="numbers"><pre>