0

我正在尝试根据用户提供的选项创建密码生成器。我当前的脚本允许用户选择大写、小写、数字和特殊字符。这完美地工作并且字符串被生成到用户所需的长度,但是在生成时,数字聚集在字符串中,字母聚集在开头。一个特殊字符将两者分开。您对如何改进流程有什么建议吗?

$('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的内容。

4

2 回答 2

2

这条线是你的罪魁祸首:

if((Math.floor(Math.random() * 2) == 0) && numCount < 3 || charCount >= 5) {

它说:

  • 前 3 个字符有超过 50/50 的可能性是数字。“then”始终是一个数字,“else”是一个数字,有时取决于选项。
  • 在您选择了 5 个“其他”字符后(这意味着在第 8 列之后),您将始终有一个数字。

这是因为“&&”优先于“||”。如果您希望有 50/50 以上的机会使用数字,我建议使用一些括号将 OR 子句括起来。我还包括了另一种方法来做 50/50。

if ((Math.random() < 0.5) && (numCount < 3 || charCount >= 5)) {

我不确定你为什么希望数字优先。

于 2013-09-13T20:17:31.350 回答
1

另一种解决方案。只是我的五分钱:

$(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/

于 2013-09-13T20:26:37.430 回答