在不使用Math.random()的请看下能不能生成20-80随机数?

当然可以。如果不使用 Math.random(),我们依然有多种方法可以生成指定范围内的随机数。具体取决于你的应用场景(是前端浏览器、后端 Node.js,还是纯算法需求)。

以下是几种常用的替代方案,它们都可以生成 20 到 80 之间的随机整数:

1. 使用 Web Crypto API(最推荐,用于浏览器环境)

如果你在前端项目中,这是替代 Math.random() 的最佳选择。它生成的是密码学安全的随机数,常用于生成 Token 或安全相关的随机值。

function getSecureRandomInt(min, max) {
    const array = new Uint32Array(1);
    window.crypto.getRandomValues(array);
    // 将随机数映射到 [min, max] 范围内
    return min + (array[0] % (max - min + 1));
}

console.log(getSecureRandomInt(20, 80));

2. 使用 Node.js 的 crypto 模块(用于 Node.js 环境)

如果你的代码运行在服务端,可以使用 Node.js 内置的加密模块。

const crypto = require('crypto');

function getSecureRandomInt(min, max) {
    const range = max - min + 1;
    // 生成一个随机整数,范围是 0 到 Number.MAX_SAFE_INTEGER
    const randomInt = crypto.randomInt(range); 
    return min + randomInt;
}

console.log(getSecureRandomInt(20, 80));

3. 使用伪随机数生成算法(如 LCG 线性同余生成器)

如果你是在做算法题、游戏开发,或者处于一个完全不支持原生随机函数的受限环境,你可以自己手写一个简单的伪随机算法。

// 一个简单的线性同余生成器 (LCG)
class SimpleRandom {
    constructor(seed = Date.now()) {
        this.seed = seed;
    }
    
    next() {
        // 常见的 LCG 参数
        this.seed = (this.seed * 1664525 + 1013904223) & 0xFFFFFFFF;
        // 返回 0 到 1 之间的浮点数
        return (this.seed >>> 0) / 0xFFFFFFFF;
    }
}

const myRandom = new SimpleRandom();
// 生成 20-80 的随机整数
const randomValue = Math.floor(myRandom.next() * (80 - 20 + 1)) + 20;
console.log(randomValue);

💡 核心数学公式提示

无论使用哪种底层随机源,生成 [min, max] 范围内整数的数学公式都是一样的:

Math.floor(随机源() * (max - min + 1)) + min

总结:

  • 如果是常规业务/安全相关:首选 crypto.getRandomValues()
  • 如果是纯算法/受限环境:自己实现一个 LCG 算法。

posted on 2026-06-15 16:24  fox_charon  阅读(6)  评论(0)    收藏  举报

导航