Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何随机生成包含两位连续相同数字的四位验证码思路整理 #617

Open
babysodme opened this issue Sep 13, 2017 · 4 comments

Comments

@babysodme
Copy link
Contributor

babysodme commented Sep 13, 2017

如何随机生成包含两位连续相同数字的四位验证码思路整理?

最初思路:随机生成三个数字——通过操作数组游标使用concat()方法在操作游标后面加一个相同的值创建并返回一个新数组。

结果:不成立啦~原因是数字根本不可以当作数组直接操作;

  • 转换思路:将数字转换为字符串用同方法操作;并用push()方法测试;

结果:也是不成立;

  • 转换思路:去犀牛书看了字符串的使用里面有匹配查找和替换;

结果:成立。将数字转为字符串使用replace()方法替换内容在转换为数字。

  • 代码部分
  var threeNumber = String(Math.round((Math.random() * 899)+100));
  // 随机生成一个三位数字并转换为字符串
  var sub = threeNumber[Math.round(Math.random() * 2)];
  // 通过随机游标定义需要查找并替换的变量
  var verifyCode = Number(threeNumber.replace (sub,sub+sub));
  // 使用repalce()查找并替换内容同时将字符串转换为数字;
  console.log(verifyCode);

收获

  1. 之前隐约记得字符串可以像数组一样操作,结果不这样,在回头看书发现写着字符串可以当做只读数组,那意思就是无法像数组一样写入了;
  2. 认识并使用了repalce()方法同时知道了更多的匹配、匹配位置等操作字符串的方法;
  3. 写收获的时候发现数组的join()方法可以将数组转化为字符串,尝试了一下又找到了splice()方法可以在数组指定位置插入元素;惊喜之余然后下面的代码就出现了。

(function(){
var random = [Math.round((Math.random() * 8)+1),Math.round((Math.random() * 8)+1),Math.round((Math.random() * 8)+1)];
// 生成长度为2的随机数组 
sub = Math.round((Math.random() * 1)+1);
// 生成0-2的随机数
random.splice(sub , 0 , random[sub]);
// 在数组的随机位置后面插入元素
verifyCode = Number(random.join(""));
// verifyCode变量代表验证码
return verifyCode;
})(); 
@babysodme babysodme changed the title 如何随机生成两位连续的四位验证码思路整理 如何随机生成包含两位连续相同数字的四位验证码思路整理 Sep 13, 2017
@xugy0926
Copy link
Owner

结果:不成立啦~原因是数字根本不可以当作数组直接操作;

你对数组没研究透。

var numbers = [1, 2, 3];

这个numbers你完全可以随机选出其中一个数字插入到某个位置。比如,选择2插入到游标1的前面。

@MyColourfulLife
Copy link
Contributor

要求 四位验证码 其中2个数相同且连续

思路: 把相同的2个数 作为1个数 那么所谓的四个数 就是三位数 因为没要求顺序 所以不要自作多情搞出个 有顺序 且 有两个数相同的 四位数

  1. 先从0-9范围内随机出 3位数 放入数组
var codeList = [];
for (var i = 0; i < 3 ; i++) {
    codeList.push(getRandomIntInclusive(0,9));
}
  1. 随机选择一个位置,在该位置后 插入随机位置的数值
rondomIndex = getRandomIntInclusive(0,2);
insertValue = codeList[rondomIndex];
codeList.splice(rondomIndex,0,insertValue);
  1. 打印看下结果
console.log(codeList);
/**
 *生成随机数的函数 
 *获取 min max 之间 的随机整数
 */
function getRandomIntInclusive(min, max) {
    min = Math.ceil(min);
    max = Math.floor(max);
    return Math.floor(Math.random() * (max - min + 1)) + min; //The maximum is inclusive and the minimum is inclusive 
  }

@WangZhong2014
Copy link
Contributor

WangZhong2014 commented Sep 15, 2017

解答方法三

我还是蛮喜欢编程的,题目也有趣!
不同的思路,代表的是不同的代码。

思路:随机生成2个数字一样的4位验证码,关键就是连续且相同的数字。

我是从流程方面来思考的,模拟出如何创造出这个数组的思路。

  1. 我们随机生成了3个数字,x1,x2,x3,把它们一个个添加到数组里面,我们一共要添加3次。
  2. 然而,当我们在添加3次的某一次(随机生成)时,添加的x重复了一次,其他的都是添加x。
    这里要加一个判断,哪一次要多做一次。
var indenityData = []; // 要生成的验证码的数组
var radom_index = parseInt(Math.random()*3);  // 随机生成一个0~3以内的整数,在哪一次,我们要重复一次。

for (var i = 0; i < 3; i++) {
	var x = parseInt(Math.random()*10);  // 随机生成0~10以内的整数,要把x加入到数组里。
	if (i === radom_index) {
		indenityData.push(x) ;
                indenityData.push(x);   // 在这里,要重复一次。
	}else {
		indenityData.push(x);   // 其他情况,就是直接加入x就行。
	}
}

console.log了一下,都是符合条件的^^~

另一个想法

其实,我还有另一个方法,比如:1233,1337。两位同学都是把它们看成了一个数组的4位元素,我把它看成是3个元素,即:1233和1337在一个数组里面是这样的:[1,2,33],[1,33,7]

这样的话,还是一样的流程,但在某一次,要添加x的时候,添加的是xx,x要变成xx。

for (var i = 0; i < 3; i++) {
	var x = parseInt(Math.random()*10);  // 随机生成0~10以内的整数,要把x加入到数组里。
	if (i === radom_index) {
		indenityData.push(x.toString() + x.toString() ) ;   // 在这里,x要变成xx,但是要考虑到00出现的情况,所以这里用的是字符串。
	}else {
		indenityData.push(x);   // 其他情况,就是直接加入x就行。
	}
}

@xugy0926
Copy link
Owner

@WangZhong2014 思路都很好。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants