Rumah  >  Artikel  >  hujung hadapan web  >  Hasilkan nombor rawak dan rentetan dalam JavaScript

Hasilkan nombor rawak dan rentetan dalam JavaScript

王林
王林asal
2023-09-02 08:57:121311semak imbas

Hasilkan nombor rawak dan rentetan dalam JavaScript

Keupayaan untuk menjana nombor rawak atau rentetan alfanumerik berguna dalam banyak situasi. Anda boleh menggunakannya untuk melahirkan musuh atau makanan di lokasi yang berbeza dalam permainan. Anda juga boleh menggunakannya untuk mencadangkan kata laluan rawak kepada pengguna atau mencipta nama fail untuk menyimpan fail.

Saya menulis tutorial tentang cara menjana rentetan alfanumerik rawak dalam PHP. Saya berkata pada permulaan siaran ini bahawa beberapa peristiwa benar-benar rawak, dan perkara yang sama berlaku untuk nombor rawak atau penjanaan rentetan.

Dalam tutorial ini, saya akan menunjukkan kepada anda cara menjana rentetan alfanumerik pseudo-rawak dalam JavaScript.

Jana nombor rawak dalam JavaScript

Mari mulakan dengan menjana nombor rawak. Kaedah pertama yang terlintas di fikiran ialah Math.random(), yang mengembalikan nombor pseudo-rawak terapung. Nombor rawak akan sentiasa lebih besar daripada atau sama dengan 0 dan kurang daripada 1. Math.random(),它返回一个浮点伪随机数。随机数将始终大于或等于 0 且小于 1。

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

for(let i = 0; i < 10; i++) {
  console.log(Math.random());
}

/* Outputs:
0.9981169188071801
0.7073616929117277
0.05826679080842556
0.30779242012809105
0.37282814053539926
0.8991639574910759
0.5851162879630685
0.40572834956467063
0.5286480734412005
0.07898699710613699
*/

生成范围内的随机整数

正如您在上一节中看到的,Math.random() 将为我们提供 0(含)到 1(不含)范围内的随机数。假设我们想要 0(含)到 100(不含)范围内的随机整数。我们在这里需要做的就是将原始范围乘以 100。

以上面代码片段的第一个输出值为例,0.9981169188071801乘以100后将变为99.81169188071801。现在,我们可以使用Math.floor()方法,该方法将向下舍入并返回最大的值小于或等于 99.81169188071801 的整数。换句话说,它会给我们 99。

以下代码片段将循环执行 10 次,以显示应用于不同数字的所有这些步骤。

const max_limit = 100;

for(let i = 0; i < 10; i++) {
  let random_float = Math.random();
  let scaled_float = random_float * max_limit;
  let random_integer = Math.floor(scaled_float);
  
  let rf_str = random_float.toString().padEnd(20, ' ');
  let sf_str = scaled_float.toString().padEnd(20, ' ');
  let ri_str = random_integer.toString().padStart(2, ' ');
  
  console.log(`Random Float: ${rf_str} Scaled Float: ${sf_str} Random Integer: ${ri_str}`);
}

/* Outputs:
Random Float: 0.7976037763162469   Scaled Float: 79.76037763162469    Random Integer: 79
Random Float: 0.3794078358214559   Scaled Float: 37.94078358214558    Random Integer: 37
Random Float: 0.5749118617425708   Scaled Float: 57.49118617425708    Random Integer: 57
Random Float: 0.7110572178100005   Scaled Float: 71.10572178100006    Random Integer: 71
Random Float: 0.9157559644743132   Scaled Float: 91.57559644743132    Random Integer: 91
Random Float: 0.8773095295734263   Scaled Float: 87.73095295734264    Random Integer: 87
Random Float: 0.7714603913623834   Scaled Float: 77.14603913623834    Random Integer: 77
Random Float: 0.6431998616346499   Scaled Float: 64.31998616346499    Random Integer: 64
Random Float: 0.7909155691442253   Scaled Float: 79.09155691442254    Random Integer: 79
Random Float: 0.1219575935563590   Scaled Float: 12.19575935563590    Random Integer: 12
*/

现在您已经了解了乘法和取整背后的逻辑,我们可以编写一个函数来生成最大限制内的随机整数。

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

for(let i = 0; i < 10; i++) {
  console.log(max_random_number(100));
}

/* Outputs:
35
23
92
94
42
9
12
56
40
21
*/

如果您想生成高于指定最小值但低于最大值的随机数该怎么办?

在这种情况下,您可以预先添加最小值,以确保生成的数字至少等于最小值。之后,您可以简单地生成一个随机数,然后按 max - min 对其进行缩放,然后将其添加到最小可能值。

function min_max_random_number(min, max) {
  return min + Math.floor(Math.random() * (max - min));
}

for(let i = 0; i < 10; i++) {
  console.log(min_max_random_number(50, 100));
}

/* Outputs:
96
81
95
56
73
72
71
90
51
53
*/

生成加密安全随机数

Math.random() 方法不适合生成加密安全的随机数,但是 Crypto.getRandomValues() 方法可以在这里帮助我们。此方法用加密安全的伪随机数填充传递的数组。请记住,用于生成这些随机数的算法可能因用户代理而异。

正如我之前提到的,您需要将基于整数的 TypedArray 传递给该方法,以便它用随机值填充它。数组的原始内容将被替换。以下代码将用随机整数填充我们的十元素数组。

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() p>Taburan nombor yang dikembalikan dalam julat ini hampir seragam, jadi kaedah ini boleh menjana nombor rawak dengan baik tanpa sisihan yang jelas dalam penggunaan harian. Berikut ialah output daripada sepuluh panggilan ke kaedah Math.random():

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 ]

Jana integer rawak dalam julat

Seperti yang anda lihat dalam bahagian sebelumnya, Math.random() akan memberikan kami nombor rawak dalam julat 0 (termasuk) hingga 1 (eksklusif). Katakan kita mahukan integer rawak dalam julat 0 (termasuk) hingga 100 (eksklusif). Apa yang perlu kita lakukan di sini ialah mendarabkan julat asal dengan 100.

Mengambil nilai output pertama coretan kod di atas sebagai contoh, 0.9981169188071801 akan menjadi 99.81169188071801 apabila didarab dengan 100. Kini, kita boleh menggunakan kaedah Math.floor(), yang akan membundarkan ke bawah dan mengembalikan integer terbesar yang nilainya kurang daripada atau sama dengan 99.81169188071801. Dalam erti kata lain, ia akan memberi kita 99.

Coretan kod berikut akan berpusing sebanyak 10 kali untuk menunjukkan semua langkah ini digunakan pada nombor yang berbeza.

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 < length; i++) {
    random_string += char_set[max_random_number(char_set.length - 1)];
  }
  
  return random_string;
}

console.log(get_random_string(20));
// Outputs: lgtuRJZolu7AXj4HMoiM

console.log(get_random_string(40));
// outputs: scOoal3VXgeAjaHIieolhi2TyWFpAn5bBPPiX6UG

Sekarang anda memahami logik di sebalik pendaraban dan pembundaran, kami boleh menulis fungsi untuk menjana integer rawak dalam had maksimum. 🎜
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
🎜Bagaimana jika anda ingin menjana nombor rawak melebihi minimum yang ditetapkan tetapi di bawah maksimum? 🎜 🎜Dalam kes ini, anda boleh menambah nilai minimum untuk memastikan nombor yang terhasil sekurang-kurangnya sama dengan nilai minimum. Selepas itu anda hanya boleh menjana nombor rawak dan menskalakannya dengan maks - min dan kemudian menambahnya kepada nilai terkecil yang mungkin. 🎜
function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

for(let i = 0; i < 10; i++) {
  console.log(max_random_number(Number.MAX_SAFE_INTEGER).toString(36));
}
/* Outputs:
1tr84s6c2sl
1yj4varyoj7
1zdg9nn0z6r
lubrjj1zih
13tt2n5vw9t
1mv6sctjgf
yx3fhnznhf
1wj4mdcrqb9
26sir75af2r
qdv9xv800t
*/

Jana nombor rawak selamat secara kriptografi

🎜Kaedah Math.random() tidak sesuai untuk menjana nombor rawak selamat secara kriptografi, tetapi kaedah Crypto.getRandomValues() boleh membantu kami di sini. Kaedah ini mengisi tatasusunan yang diluluskan dengan nombor pseudo-rawak yang selamat secara kriptografi. Perlu diingat bahawa algoritma yang digunakan untuk menjana nombor rawak ini mungkin berbeza dari ejen pengguna kepada ejen pengguna. 🎜 🎜Seperti yang saya nyatakan sebelum ini, anda perlu menghantar TypedArray berasaskan integer kepada kaedah supaya ia mengisinya dengan nilai rawak. Kandungan asal tatasusunan akan diganti. Kod berikut akan mengisi tatasusunan sepuluh elemen kami dengan integer rawak. 🎜
function max_random_number(max) {
  return Math.floor(Math.random() * max);
}

function get_random_string(length) {
  let random_string = '';
  while(random_string.length < length) {
   random_string += max_random_number(Number.MAX_SAFE_INTEGER).toString(36);
  }
  return random_string.substring(0, length);
}

console.log(get_random_string(40));
// Outputs: bn0nfhcsjm18ylzqrm6bo1iktka2aq7qbbl5ybki

console.log(get_random_string(100));
// Outputs: rdosjhthsevmk91mj9zvqexz2z0v3pe2beasbzoworanzjg3bfpf975rzfy2fmo6pmj4p69u0x80ce92jh2vljx90g6r0lzd8vb0
🎜Unit8Array() Pembina menyediakan kami dengan tatasusunan 10 integer tidak bertanda 8-bit. Nilai tatasusunan semuanya dimulakan kepada sifar. 🎜 🎜Sebaik sahaja kami menghantar tatasusunan ini kepada kaedah getRandomValues(), nilai nombor rawak akan kekal antara 0 dan 255. Anda boleh menggunakan jenis tatasusunan lain untuk menjana julat nombor rawak yang berbeza. Sebagai contoh, menggunakan pembina Int8Array() akan memberikan kita tatasusunan nilai integer antara -128 dan 127. Begitu juga, menggunakan Uint16Array() akan memberikan kami tatasusunan nilai integer ​​sehingga 65,535. 🎜 rrreee 🎜Jana rentetan abjad angka rawak dalam JavaScript🎜 🎜Kami kini akan menggunakan pengetahuan yang diperoleh dalam bahagian sebelumnya untuk menjana rentetan alfanumerik rawak dalam JavaScript. 🎜 🎜Konsepnya sangat mudah. Kita akan mulakan dengan rentetan yang mengandungi semua aksara yang diperlukan. Dalam contoh ini, rentetan akan terdiri daripada huruf kecil, huruf besar dan nombor dari 0 hingga 9. Seperti yang anda sedia maklum, kita boleh mengakses aksara pada kedudukan tertentu dalam rentetan dengan menghantar nilai indeks kepada rentetan. 🎜 🎜Untuk menjana rentetan alfanumerik rawak, kita hanya perlu menjana nombor rawak dan kemudian mengakses aksara pada indeks rawak itu untuk menambahkannya pada rentetan rawak kita. Coretan kod berikut membungkus semuanya dalam fungsi kecil yang menarik: 🎜
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 < length; i++) {
    random_string += char_set[max_random_number(char_set.length - 1)];
  }
  
  return random_string;
}

console.log(get_random_string(20));
// Outputs: lgtuRJZolu7AXj4HMoiM

console.log(get_random_string(40));
// outputs: scOoal3VXgeAjaHIieolhi2TyWFpAn5bBPPiX6UG

使用 toString() 生成随机字母数字字符串

我们可以用来生成随机字母数字字符串的另一种方法是对随机生成的数字使用 toString() 方法。 toString() 方法返回一个表示我们指定数值的字符串。此方法接受可选的 radix 参数,该参数指定要表示数字的基数。值为 2 将返回二进制字符串,值为 16 将返回十六进制字符串。该参数默认值为10。最大值可以为36,因为它涵盖了全部26个字母和10个数字。

以下是针对不同 radix 值对此方法进行几次调用的输出:

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 < 10; i++) {
  console.log(max_random_number(Number.MAX_SAFE_INTEGER).toString(36));
}
/* Outputs:
1tr84s6c2sl
1yj4varyoj7
1zdg9nn0z6r
lubrjj1zih
13tt2n5vw9t
1mv6sctjgf
yx3fhnznhf
1wj4mdcrqb9
26sir75af2r
qdv9xv800t
*/

如果您想要更大的字母数字字符串并希望它们具有固定长度(例如 40 个字符或 100 个字符)怎么办?在这种情况下,我们可以创建一个循环,不断附加生成的字符串,直到达到所需的长度。

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

function get_random_string(length) {
  let random_string = '';
  while(random_string.length < length) {
   random_string += max_random_number(Number.MAX_SAFE_INTEGER).toString(36);
  }
  return random_string.substring(0, length);
}

console.log(get_random_string(40));
// Outputs: bn0nfhcsjm18ylzqrm6bo1iktka2aq7qbbl5ybki

console.log(get_random_string(100));
// Outputs: rdosjhthsevmk91mj9zvqexz2z0v3pe2beasbzoworanzjg3bfpf975rzfy2fmo6pmj4p69u0x80ce92jh2vljx90g6r0lzd8vb0

最终想法

在本教程中,我们学习了如何在 JavaScript 中生成随机数和字母数字字符串。借助 Math.random() 方法,在 JavaScript 中生成随机整数很容易。我们所要做的就是缩放输出,使其符合我们所需的范围。如果您希望随机数具有加密安全性,您还可以考虑使用 getRandomValues() 方法。

一旦我们知道如何生成随机数,创建随机字母数字字符串就很容易了。我们需要做的就是弄清楚如何将数字转换为字符。我们在这里使用了两种方法。第一个涉及访问预定义字符串中随机数字索引处的字符。如果您想具体了解随机字母数字字符串中应包含的字符,则此技术非常有用。另一种方法涉及使用 toString() 方法将十进制数转换为不同的基数。这减少了对 max_random_number() 函数的调用。

当然还有更多技术可用于生成随机字母数字字符串。这完全取决于您的需求以及您想要的方法的创意程度。

Atas ialah kandungan terperinci Hasilkan nombor rawak dan rentetan dalam JavaScript. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn