xugy0926 / getting-started-with-javascript

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

babysodme opened this issue · comments

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

最初思路:随机生成三个数字——通过操作数组游标使用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;
})(); 

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

你对数组没研究透。

var numbers = [1, 2, 3];

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

要求 四位验证码 其中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 
  }

解答方法三

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

思路:随机生成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就行。
	}
}

@WangZhong2014 思路都很好。