JQuery 字符串“随机发生器”聚类字符
JQuery string 'randomizer' clustering characters
我正在尝试根据用户提供的选项创建一个密码生成器。我当前的脚本允许用户选择大写、小写、数字和特殊字符。这非常有效,字符串被生成到用户所需的长度,但是在生成时,数字在字符串上聚集,字母在开头聚类。一个特殊字符将两者分开。您对如何改进流程有什么建议吗?
$('document').ready(function() {
$('button').click(function() {
var lower = "";
var upper = "";
var numeric = "";
var special = "";
var string_length = "";
if($('#12').is(':checked')) { string_length = 12; };
if($('#16').is(':checked')) { string_length = 16; };
if($('#18').is(':checked')) { string_length = 18; };
if($('#22').is(':checked')) { string_length = 22; };
if($('#24').is(':checked')) { string_length = 24; };
if($('#custom').is(':checked')) { $('#custom').show(); $('#custom').val(); } else { $('#custom').hide(); };
if($('#ch1').is(':checked')) { lower = "abcdefghijklmnopqrstuvwxyz"; } else { lower = ""; };
if($('#ch2').is(':checked')) { upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; } else { upper = ""; };
if($('#ch3').is(':checked')) { numeric = "0123456789"; } else { numeric = ""; };
if($('#ch4').is(':checked')) { special = "!£$%^&*()_-+={};:@~#?/"; } else { special = ""; };
var chars = lower + upper + numeric + special;
var randomstring = '';
var charCount = 0;
var numCount = 0;
for (var i=0; i<string_length; i++) {
if((Math.floor(Math.random() * 2) == 0) && numCount < 3 || charCount >= 5) {
var rnum = Math.floor(Math.random() * 10);
randomstring += rnum;
numCount += 1;
} else {
var rnum = Math.floor(Math.random() * chars.length);
randomstring += chars.substring(rnum,rnum+1);
charCount += 1;
}
}
$('span.string').html(randomstring);
});
});
选项 16 长度、小写、大写、数字和特殊字符返回类似 e046pzw%65760294 的内容。
这条线是你的罪魁祸首:
if((Math.floor(Math.random() * 2) == 0) && numCount < 3 || charCount >= 5) {
它说:
- 前 3 个字符成为数字的几率略高于 50/50。"then"始终是一个数字,而"else"有时是一个数字,具体取决于选项。
- 在您选择了 5 个"else"字符后(这意味着在 col 8 之后),您将始终拥有一个数字。
&"优先于"||"。如果您想有 50/50 以上的使用数字的机会,我建议使用一些括号来包围 OR 子句。我还包括一种执行 50/50 的替代方法。
if ((Math.random() < 0.5) && (numCount < 3 || charCount >= 5)) {
我不确定你为什么希望数字有优先权。
另一种解决方案。只有我的五美分:
$(function(){
$('input, select').change(function(){
var s = $('input[type="checkbox"]:checked').map(function(i, v){
return v.value;
}).get().join(''),
result = '';
for(var i=0; i < $('#length').val(); i++)
result += s.charAt(Math.floor(Math.random() * s.length));
$('#result').val(result);
});
});
只是为了给你一些想法。我完全知道这不会考虑任何"类型计数"。
http://jsfiddle.net/m5y3e/
相关文章:
- 开放层 3 ,聚类多边形或线
- 如何在不与谷歌地图重叠的情况下对标记进行聚类
- 单击过滤器后重新计算标记聚类
- 传单:如何使用聚类从不同图层的下拉菜单中选择标记
- 开放层,更改聚类标记
- 如何使用图层应用传单标记聚类
- 标记聚类不显示点
- D3.js具有大(>500,000)点的散点图?聚类
- 在谷歌地图v3 API中使用信息窗口进行聚类标记
- 标记和聚类的问题
- JQuery 字符串“随机发生器”聚类字符
- 标记聚类器,也在 1 个标记处聚类
- Google 地图 API V3:从聚类分析中排除单个标记
- 基于点的聚类可在任何给定时间查找图钉聚类纬度经度
- 如何更改传单标记聚类扩展的单个标记节点图标
- 可以在恒定内存中对低维数据进行聚类
- 寻找一种算法来聚类三维点,围绕二维点
- 打印带有标记和标记聚类的谷歌地图
- 谷歌地图API-聚类标记-如何隐藏,禁用或清除选定或过滤的聚类标记
- 基于距离对数据进行聚类