AI编程助手
AI免费问答

JavaScript中生成随机数字和字符串

王林   2023-09-02 08:57   1868浏览 原创

javascript中生成随机数字和字符串

生成随机数或字母数字字符串的能力在许多情况下都会派上用场。您可以使用它在游戏中的不同位置生成敌人或食物。您还可以使用它向用户建议随机密码或创建文件名来保存文件。

我写了一篇关于如何在 PHP 中生成随机字母数字字符串的教程。我在这篇文章的开头说,几乎没有事件是真正随机的,同样的情况也适用于随机数或字符串生成。

在本教程中,我将向您展示如何在 JavaScript 中生成伪随机字母数字字符串。

在 JavaScript 中生成随机数

让我们从生成随机数开始。我想到的第一个方法是 Math.random(),它返回一个浮点伪随机数。随机数将始终大于或等于 0 且小于 1。

该范围内返回的数字的分布几乎是均匀的,因此该方法可以很好地生成随机数,而在日常使用中不会出现明显的偏差。以下是对 Math.random() 方法十次调用的输出:

for(let i = 0; i 
<h3 id="toc-fwaa-generate-random-integers-within-range">生成范围内的随机整数</h3>
<p>正如您在上一节中看到的,<code>Math.random()</code> 将为我们提供 0(含)到 1(不含)范围内的随机数。假设我们想要 0(含)到 100(不含)范围内的随机整数。我们在这里需要做的就是将原始范围乘以 100。</p>
<p>以上面代码片段的第一个输出值为例,0.9981169188071801乘以100后将变为99.81169188071801。现在,我们可以使用<code>Math.floor()</code>方法,该方法将向下舍入并返回最大的值小于或等于 99.81169188071801 的整数。换句话说,它会给我们 99。</p>
<p>以下代码片段将循环执行 10 次,以显示应用于不同数字的所有这些步骤。</p>
<pre class="brush:javascript;toolbal:false;">const max_limit = 100;

for(let i = 0; i 
<p>现在您已经了解了乘法和取整背后的逻辑,我们可以编写一个函数来生成最大限制内的随机整数。</p>
<pre class="brush:javascript;toolbal:false;">function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

for(let i = 0; i 
<p>如果您想生成高于指定最小值但低于最大值的随机数该怎么办?</p>
<p>在这种情况下,您可以预先添加最小值,以确保生成的数字至少等于最小值。之后,您可以简单地生成一个随机数,然后按 <code>max - min</code> 对其进行缩放,然后将其添加到最小可能值。</p>
<pre class="brush:javascript;toolbal:false;">function min_max_random_number(min, max) {
  return min + Math.floor(Math.random() * (max - min));
}

for(let i = 0; i 
<h3 id="toc-fifc-generate-cryptographyally-secure-random-numbers">生成加密安全随机数</h3>
<p><code>Math.random()</code> 方法不适合生成加密安全的随机数,但是 <code>Crypto.getRandomValues()</code> 方法可以在这里帮助我们。此方法用加密安全的伪随机数填充传递的数组。请记住,用于生成这些随机数的算法可能因用户代理而异。</p>
<p>正如我之前提到的,您需要将基于整数的 <code>TypedArray</code> 传递给该方法,以便它用随机值填充它。数组的原始内容将被替换。以下代码将用随机整数填充我们的十元素数组。</p>
<pre class="brush:javascript;toolbal:false;">let random_values = new Uint8Array(10);
console.log(random_values);
// Outputs: Uint8Array(10) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

crypto.getRandomValues(random_values);
console.log(random_values);
// Outputs: Uint8Array(10) [ 207, 209, 1, 145, 70, 111, 21, 141, 54, 200 ]

Unit8Array() 构造函数为我们提供了一个由 10 个 8 位无符号整数组成的数组。数组值全部初始化为零。

一旦我们将此数组传递给 getRandomValues() 方法,随机数的值将保持在 0 到 255 之间。您可以使用其他类型数组来生成不同范围的随机数。例如,使用 Int8Array() 构造函数将为我们提供一个整数值在 -128 到 127 之间的数组。同样,使用 Uint16Array() 将为我们提供一个整数值最大为 65,535 的数组。 p>

let random_values = new Int8Array(10);
console.log(random_values);
// Outputs: Int8Array(10) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

crypto.getRandomValues(random_values);
console.log(random_values);
// Outputs: Int8Array(10) [ -82, -106, 87, 64, 42, -36, -53, 27, -38, 4 ]


let random_values = new Uint16Array(10);
console.log(random_values);
// Outputs: Uint16Array(10) [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ]

crypto.getRandomValues(random_values);
console.log(random_values);
// Outputs: Uint16Array(10) [ 47615, 60195, 53177, 15169, 215, 4928, 12200, 6307, 30320, 20271 ]

在 JavaScript 中生成随机字母数字字符串

我们现在将使用上一节中获得的知识在 JavaScript 中生成随机字母数字字符串。

这个概念非常简单。我们将从包含所有所需字符的字符串开始。在本例中,字符串将由小写字母、大写字母和 0 到 9 的数字组成。您可能已经知道,我们可以通过向字符串传递索引值来访问字符串中特定位置的字符。

要生成随机字母数字字符串,我们所需要做的就是生成随机数,然后访问该随机索引处的字符以将其附加到我们的随机字符串中。以下代码片段将其全部包装在一个漂亮的小函数中:

const char_set = 'abcdefghijlkmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';

function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

function get_random_string(length) {
  let random_string = '';

  for(let i = 0; i 
<h3 id="toc-tmsc-using-tostring-to-generate-random-alphanumeric-string">使用 <code>toString()</code> 生成随机字母数字字符串</h3>
<p>我们可以用来生成随机字母数字字符串的另一种方法是对随机生成的数字使用 <code>toString()</code> 方法。 <code>toString()</code> 方法返回一个表示我们指定数值的字符串。此方法接受可选的 <code>radix</code> 参数,该参数指定要表示数字的基数。值为 2 将返回二进制字符串,值为 16 将返回十六进制字符串。该参数默认值为10。最大值可以为36,因为它涵盖了全部26个字母和10个数字。</p>
<p>以下是针对不同 <code>radix</code> 值对此方法进行几次调用的输出:</p>
<pre class="brush:javascript;toolbal:false;">let number = 3498650143868;

console.log(number.toString(2));
// Outputs: 110010111010010111110011001000110001111100

console.log(number.toString(10));
// Outputs: 3498650143868

console.log(number.toString(16));
// Outputs: 32e97cc8c7c

console.log(number.toString(36));
// Outputs: 18n99yoak

您可能已经注意到,随着我们增加 radix,输出字符串的长度不断减少。在下面的代码片段中,我们将使用上一节中的 max_random_number() 函数来获取随机数。然后,我们将使用 toString() 方法将此随机数转换为字母数字字符串。

function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

for(let i = 0; i 
<p>如果您想要更大的字母数字字符串并希望它们具有固定长度(例如 40 个字符或 100 个字符)怎么办?在这种情况下,我们可以创建一个循环,不断附加生成的字符串,直到达到所需的长度。</p>
<pre class="brush:javascript;toolbal:false;">function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

function get_random_string(length) {
  let random_string = '';
  while(random_string.length 
<h2 id="toc-nldj-final-thoughts">最终想法</h2>
<p>在本教程中,我们学习了如何在 JavaScript 中生成随机数和字母数字字符串。借助 <code>Math.random()</code> 方法,在 JavaScript 中生成随机整数很容易。我们所要做的就是缩放输出,使其符合我们所需的范围。如果您希望随机数具有加密安全性,您还可以考虑使用 <code>getRandomValues()</code> 方法。</p>
<p>一旦我们知道如何生成随机数,创建随机字母数字字符串就很容易了。我们需要做的就是弄清楚如何将数字转换为字符。我们在这里使用了两种方法。第一个涉及访问预定义字符串中随机数字索引处的字符。如果您想具体了解随机字母数字字符串中应包含的字符,则此技术非常有用。另一种方法涉及使用 <code>toString()</code> 方法将十进制数转换为不同的基数。这减少了对 <code>max_random_number()</code> 函数的调用。</p>
<p>当然还有更多技术可用于生成随机字母数字字符串。这完全取决于您的需求以及您想要的方法的创意程度。</p>

Java免费学习笔记:立即学习
解锁 Java 大师之旅:从入门到精通的终极指南

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。