当前位置: 首页 > 面试题库 >

无需任何外部函数即可生成随机数

殷承恩
2023-03-14
问题内容

这是我最近参加的一次采访中提出的问题。

据我所知,两个数字之间的随机数可以生成如下

public static int rand(int low, int high) {
    return low + (int)(Math.random() * (high - low + 1));
}

但是在这里,我使用Math.random()生成一个介于0和1之间的随机数,并使用它来帮助我生成一个介于低数和高数之间的数。我还有其他方法可以直接使用,而无需使用外部函数吗?


问题答案:

典型的伪随机数生成器基于先前的数字来计算新数字,因此从理论上讲,它们是完全确定的。通过提供良好的种子(随机数生成算法的初始化)来保证唯一的随机性。只要随机数不是非常严格的安全性(这将需要“真实”随机数),这样的递归随机数生成器通常就可以满足需求。

一旦提供了种子,就可以在没有任何“外部”功能的情况下表达递归生成。有两种算法可以解决此问题。线性同余生成器就是一个很好的例子。

伪代码实现可能如下所示:

long a = 25214903917;   // These Values for a and c are the actual values found
long c = 11;            // in the implementation of java.util.Random(), see link
long previous = 0;

void rseed(long seed) {
    previous = seed;
}

long rand() {
    long r = a * previous + c;
    // Note: typically, one chooses only a couple of bits of this value, see link
    previous = r;
    return r;
}

您仍然需要使用一些初始值为该生成器添加种子。这可以通过执行以下任一操作来完成:

  • 使用当前时间(在大多数非安全性至关重要的情况下,例如游戏中使用)
  • 使用硬件噪声(对安全性至关重要的随机性有好处)
  • 使用常数(用于调试,因为您始终获得相同的序列)
  • 如果您不能使用 任何 函数并且不想使用常量种子,并且使用的语言允许这样做,那么您还可以使用一些未初始化的内存。例如,在C和C ++中,定义一个新变量,不要为其分配任何内容,而应使用其值作为生成器的种子。但是请注意,这远非成为“好种子”,而仅仅是满足您要求的技巧。切勿在真实代码中使用此代码

请注意, 没有一种算法* 可以 不访问某些 外部源( 例如系统环境)的情况下,使用 相同的输入不同的 运行生成
不同的 值。每个种子良好的随机数生成器都使用一些外部源。
*



 类似资料:
  • random 生成随机数包 文档:https://www.npmjs.com/package/random 安装:npm install --save random 封装代码: app / extend / context.js // 导入 jwt const jwt = require('jsonwebtoken') // 导入随机数包 const random = require('rando

  • 问题 你需要生成在一定范围内的随机数。 解决方案 使用 JavaScript 的 Math.random() 来获得浮点数,满足 0<=X<1.0 。使用乘法和 Math.floor 得到在一定范围内的数字。 probability = Math.random() 0.0 <= probability < 1.0 # => true # 注意百分位数不会达到 100。从 0 到 100 的范围实

  • 问题内容: JavaScript函数返回一个介于0到1之间的随机值,该值会根据当前时间自动播种(我相信类似于Java)。但是,我认为没有任何办法可以为其设置种子。 如何制作一个可以提供自己的种子值的随机数生成器,以使它生成可重复的(伪)随机数序列? 问题答案: 一种选择是http://davidbau.com/seedrandom,它是可播种的基于RC4的Math.random()插入式替换,具有

  • 问题 你需要生成在一定范围内的随机数,但你也需要对发生器进行“生成种子”操作来提供可预测的值。 解决方案 编写你自己的随机数生成器。当然有很多方法可以做到这一点,这里给出一个简单的示例。 该发生器绝对不可以以加密为目的! class Rand # 如果没有种子创建,使用当前时间作为种子 constructor: (@seed) -> # Knuth and Lewis' impro

  • 在 Java 中要生成一个指定范围之内的随机数字有两种方法:一种是调用 Math 类的 random() 方法,一种是使用 Random 类。 Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1

  • 我的任务: 生成1到20之间的随机数,小数点后1位。 然而,我的问题就像mt_rand一样简单。我希望大多数生成的数字较低,大约0.5-4.5,偶尔的数字在4.5-10之间,很少说每12-20小时一次在10-20之间。 我一直在使用以下内容,但不知道从哪里开始。我是一个很基本的自学程序员。 也许如果我简单地解释一下为什么我想要这个,它可能会有帮助… 我拥有一个在线游戏,想要添加3个“银行”与每个银

  • 我需要在我的脚本中生成大约5000个随机数,但是CPU速度太快了,我看到了随机数的趋势。 例如,在第一次迭代的100次中,我用rand(0100)得到了80个介于70和99之间的值;,这真的很不方便。 有没有办法解决这样的问题,或者说,在2012年,随机性已经无法实现了? 我相信有可能从一个执行随机次数的函数中生成随机数。。。但我想不出一个。

  • Python3 实例 以下实例演示了如何生成一个随机数:# -*- coding: UTF-8 -*- # Filename : test.py # author by : www.runoob.com # 生成 0 ~ 9 之间的随机数 # 导入 random(随机数) 模块 import random print(random.randint(0,9)) 执行以上代码输出结果为: 4 以上