JavaScript實(shí)現(xiàn)隨機(jī)產(chǎn)生字符串的方法分享
這個(gè)東西就是隨機(jī)產(chǎn)生字符串的函數(shù)。
參數(shù),代碼里面有解釋。
用途:當(dāng)作產(chǎn)生隨機(jī)密碼來(lái)看使用吧,或者nodejs后端存儲(chǔ)數(shù)據(jù)庫(kù)的主鍵來(lái)使用吧。
/** * 這個(gè)是一個(gè)隨機(jī)產(chǎn)生字符串的函數(shù) * @param {object} cfg 參數(shù) cfg = { split: '', // 分割字符 splitNum: 0, // 分隔個(gè)數(shù) num: 16, // 產(chǎn)生隨機(jī)字符個(gè)數(shù) 默認(rèn)16 char: 'dAa', // d數(shù)字 A大寫(xiě)的字符 a小寫(xiě)的字符 默認(rèn)dAa append: '@*!+-=*&[()`?.]', // 添加的其他額外字符,支持?jǐn)?shù)組[]和字符串 默認(rèn)@*!+-=*&[()`?. ignore: '', // 可以忽略的字符,支持?jǐn)?shù)組[]和字符串 優(yōu)先級(jí)最高 } * @returns 返回隨機(jī)字符串 */ const rand_str = (cfg) => { if(cfg === undefined) cfg = {} const getValue = (s, d) => { if([undefined, null].includes(s)) return d else return s } cfg = { split: getValue(cfg.split, ''), // 分割字符 splitNum: parseInt(cfg.splitNum) || 0, // 分隔個(gè)數(shù) num: parseInt(cfg.num) || 16, // 字符個(gè)數(shù) 默認(rèn)16 char: getValue(cfg.char, 'dAa') , // d數(shù)字 A大寫(xiě)的字符 a小寫(xiě)的字符 append: getValue(cfg.append, '@*!+-=*&[()`?.') , // 支持?jǐn)?shù)組[]和字符串 一般指特殊字符@*!+-=*&[()`?. ignore: getValue(cfg.ignore, '') // 支持?jǐn)?shù)組[]和字符串 優(yōu)先級(jí)最高 } // console.log(cfg) let set = new Set() const getChars = (str) => { for(const s of str) set.add(s) } // 1、先取出append特殊字符的編碼 getChars(cfg.append) // 2、獲取char中的字符集 const number = "0123456789" const bigChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" const smallChars = "abcdefghijklmnopqrstuvwxyz" for(const s of cfg.char) { if(s === 'd') getChars(number) else if (s === 'A') getChars(bigChars) else if (s === 'a') getChars(smallChars) // 其他的字符 自動(dòng)忽略 } // 3. 排除ignore忽略的元素 for(const s of cfg.ignore) set.delete(s) // 4. 生成數(shù)組 const arr = Array.from(set) // console.log(arr) // 5. 打亂集合 const swap = (firstIndex, secondIdex) => { const t = arr[firstIndex] arr[firstIndex] = arr[secondIdex] arr[secondIdex] = t } const size = arr.length for(let i = 0; i < cfg.num; i++) swap(Math.floor(Math.random() * size), Math.floor(Math.random() * size)) // 6、生成隨機(jī)字符串 let re = "" for(let i = 0; i < cfg.num; i++) { if(i % cfg.splitNum === 0 && i !== 0) re += cfg.split re += arr[Math.floor(Math.random() * size)] } return re } /** * 測(cè)試 */ for(let i = 1; i< 10; i++) console.log(rand_str()) console.log('----------------------------') const config = { split: '', // 分割字符 splitNum: 0, // 分隔個(gè)數(shù) num: 20, // 產(chǎn)生隨機(jī)字符個(gè)數(shù) 默認(rèn)16 char: 'Aa', // d數(shù)字 A大寫(xiě)的字符 a小寫(xiě)的字符 默認(rèn)dAa append: '@*!+-=*&[()`?.]', // 添加的其他額外字符,支持?jǐn)?shù)組[]和字符串 默認(rèn)@*!+-=*&[()`?. ignore: '@*!+-=*&[()`?.]', // 可以忽略的字符,支持?jǐn)?shù)組[]和字符串 優(yōu)先級(jí)最高 } for(let i = 1; i< 10; i++) console.log(rand_str(config))
知識(shí)點(diǎn)補(bǔ)充
math.random()
math.random()方法返回一個(gè)偽隨機(jī)浮點(diǎn)數(shù),結(jié)果區(qū)間為[0, 1),在區(qū)間內(nèi)近似均勻分布,可以使用別的方法縮放到所需的范圍。它實(shí)現(xiàn)了選擇初始值的隨機(jī)數(shù)生成算法;使用者無(wú)法主動(dòng)選擇值或進(jìn)行重置。
Math.random(); // 0.21446359414239313
Math.random 會(huì)提供給我們一個(gè)[0,1)之間的隨機(jī)數(shù),但是如果我們要[1,10]范圍隨機(jī)整數(shù)的話,可以使用以下三個(gè)函數(shù):
- math.round() 四舍五入
- math.ceil() 向上取整
- math.floor() 向下取整
Math.ceil(Math.random() * 10); // 7
快速生成隨機(jī)字符串
利用 toString,hex 代表進(jìn)制,最大不能超過(guò) 36,36 = 10 + 26 個(gè)英文字母 hex 越大,字母占比越多
Math.random().toString(36).slice(2);
注意:
- 該方式無(wú)法保證字符串長(zhǎng)度一致
- 當(dāng) Math.random()的結(jié)果是有限長(zhǎng)度小數(shù)時(shí),比如 0.5,0.55,會(huì)導(dǎo)致得到的結(jié)果不符合預(yù)期
測(cè)試
// 十萬(wàn)次 var a = Array.from(new Array(100000).keys()); var b = a.map((i) => Math.random().toString(36).slice(2)); new Set(Object.values(b.map((i) => i.length))); // Set(8) {10, 11, 9, 12, 8, 13, 14, 7}
可以自己試一下,每次運(yùn)行的結(jié)果可能是不同的,其原因是 Math.random()生成的數(shù)字保留的小數(shù)長(zhǎng)度本身是不固定的
// 百萬(wàn)次 var a = Array.from(new Array(1000000).keys()); new Set(Object.values(a.map((i) => (Math.random() + "").length))); // Set(14) {19, 18, 17, 20, 16, 21, 22, 15, 14, 13, 23, 11, 24, 12}
快速生成固定長(zhǎng)度的隨機(jī)字符串
/** * 生成指定長(zhǎng)度的字符串 * @param {Number} hex 代表進(jìn)制,取值范圍[2 - 36],最大不能超過(guò) 36, 數(shù)字越大字母占比越高,小于11為全數(shù)字 * @param {Number} len 字符串長(zhǎng)度 */ function generateStr(hex, len) { if (hex < 2 || hex > 36) { throw new RangeError("hex argument must be between 2 and 36"); } var res = Math.random().toString(hex).slice(2); var resLen = res.length; while (resLen < len) { res += Math.random().toString(hex).slice(2); resLen = res.length; } return res.substr(0, len); }
測(cè)試
// 執(zhí)行十萬(wàn)次,可以在50ms左右穩(wěn)定獲取長(zhǎng)度為10的隨機(jī)字符串 console.time("exec"); var a = Array.from(new Array(100000).keys()); console.log(new Set(a.map((i) => generateStr(22, 10).length))); console.timeEnd("exec"); // Set(1) {10} // exec: 49.966064453125 ms
到此這篇關(guān)于JavaScript實(shí)現(xiàn)隨機(jī)產(chǎn)生字符串的方法分享的文章就介紹到這了,更多相關(guān)JavaScript隨機(jī)產(chǎn)生字符串內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- js隨機(jī)生成字母數(shù)字組合的字符串 隨機(jī)動(dòng)畫(huà)數(shù)字
- Js生成隨機(jī)數(shù)/隨機(jī)字符串的方法小結(jié)【5種方法】
- JS實(shí)現(xiàn)生成由字母與數(shù)字組合的隨機(jī)字符串功能詳解
- JS簡(jiǎn)單生成由字母數(shù)字組合隨機(jī)字符串示例
- javascript創(chuàng)建含數(shù)字字母的隨機(jī)字符串方法總結(jié)
- JavaScript生成隨機(jī)字符串的方法
- javascript自動(dòng)生成包含數(shù)字與字符的隨機(jī)字符串
- JS生成隨機(jī)字符串的多種方法
- js 數(shù)組隨機(jī)字符串(廣告不重復(fù))
- js 按照指定間隔 向字符串中插入隨機(jī)字符串的實(shí)現(xiàn)代碼
- JS實(shí)現(xiàn)隨機(jī)生成字符串(可指定長(zhǎng)度)的示例代碼
相關(guān)文章
微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能
這篇文章主要為大家詳細(xì)介紹了微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05超鏈接怎么正確調(diào)用javascript函數(shù)
本文介紹使用超鏈接調(diào)用javasript函數(shù)且不會(huì)影響GIF圖片動(dòng)畫(huà)的方法,有遇到相同問(wèn)題的小伙伴可以參考一下。2016-05-05基于JS實(shí)現(xiàn)漫畫(huà)中大雨滂沱的效果
這篇文章主要為大家詳細(xì)介紹了如何利用JavaScript實(shí)現(xiàn)漫畫(huà)中大雨滂沱的效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06JavaScript自定義localStorage監(jiān)聽(tīng)事件的解決方法
在項(xiàng)目開(kāi)發(fā)過(guò)程中,發(fā)現(xiàn)有很多時(shí)候進(jìn)行l(wèi)ocalStorage.setItem()操作設(shè)置本地存儲(chǔ)后,頁(yè)面必須刷新才能夠獲取到存儲(chǔ)數(shù)據(jù),為了解決這個(gè)問(wèn)題,就必須要用到自定義localStorage監(jiān)聽(tīng)事件了,所以本文給大家介紹了自定義localStorage監(jiān)聽(tīng)事件,需要的朋友可以參考下2024-10-10JS遍歷Json字符串中鍵值對(duì)先轉(zhuǎn)成JSON對(duì)象再遍歷
這篇文章主要介紹了JS遍歷Json字符串中鍵值對(duì)的方法,先將Json字符串轉(zhuǎn)換成JSON對(duì)象,再進(jìn)行遍歷,需要的朋友可以參考下2014-08-08Bootstrap基本組件學(xué)習(xí)筆記之按鈕組(8)
這篇文章主要為大家詳細(xì)介紹了Bootstrap基本組件學(xué)習(xí)筆記之按鈕組,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12js實(shí)現(xiàn)微信/QQ直接跳轉(zhuǎn)到支付寶APP打開(kāi)口令領(lǐng)紅包功能
最近支付寶的領(lǐng)紅包可真是刷爆了各個(gè)微信群啊,滿群都是支付寶口令,可是這樣推廣很麻煩,下面小編給大家?guī)?lái)了js實(shí)現(xiàn)微信/QQ直接跳轉(zhuǎn)到支付寶APP打開(kāi)口令領(lǐng)紅包功能,需要的朋友參考下2018-01-01document.getElementById方法在Firefox與IE中的區(qū)別
相信很多朋友在寫(xiě)JavaScript的時(shí)候,對(duì)瀏覽器的兼容問(wèn)題會(huì)感到很頭疼。這不,煩什么,什么就來(lái)了,特記錄下來(lái),與大家分享。2010-05-05