对1000个随机手机号码进行分析

发布时间:2023-05-20

一、手机号码的结构

手机号码通常由11位数字组成,其中前三位表示运营商,目前中国三大运营商分别是中国移动、中国联通和中国电信。前三位的编号如下:

中国移动:134、135、136、137、138、139、150、151、152、157、158、159、182、183、184、187、188、147、178
中国联通:130、131、132、155、156、185、186、145、176
中国电信:133、153、180、181、189、177、173、149

手机号码的第4-7位是为地区编码,表示该手机号属于哪个省份或直辖市。第8-11位是用户号码,全国每个号码段的数量都有限制,总共不超过1亿。

二、合法性验证

在进行数据处理之前,需要对这1000个随机手机号码进行合法性验证,主要包括以下几个方面:

  1. 是否为11位数字
function isPhoneNumber(phoneNumber) {
  if (phoneNumber && /^[0-9]{11}$/.test(phoneNumber)) {
    return true;
  }
  return false;
}
  1. 是否符合手机号码的规则
function isMobilePhoneNumber(phoneNumber) {
  if (phoneNumber && /^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\d{8}$/.test(phoneNumber)) {
    return true;
  }
  return false;
}
  1. 是否属于三大运营商
function getMobileServiceProvider(phoneNumber) {
  if (!isMobilePhoneNumber(phoneNumber)) {
    return '';
  }
  var serviceProvider = '';
  var mobileNumber = phoneNumber.substr(0, 7);
  if (/^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|184|187|188|147|178)/.test(mobileNumber)) {
    serviceProvider = '中国移动';
  } else if (/^(130|131|132|155|156|185|186|145|176)/.test(mobileNumber)) {
    serviceProvider = '中国联通';
  } else if (/^(133|153|180|181|189|177|173|149)/.test(mobileNumber)) {
    serviceProvider = '中国电信';
  }
  return serviceProvider;
}

三、地区分布

根据手机号码第4-7位的地区编码,可以统计出这1000个随机手机号码的地区分布情况:

var provinces = {
  '11': '北京',
  '12': '天津',
  '13': '河北',
  '14': '山西',
  '15': '内蒙古',
  '21': '辽宁',
  '22': '吉林',
  '23': '黑龙江',
  '31': '上海',
  '32': '江苏',
  '33': '浙江',
  '34': '安徽',
  '35': '福建',
  '36': '江西',
  '37': '山东',
  '41': '河南',
  '42': '湖北',
  '43': '湖南',
  '44': '广东',
  '45': '广西',
  '46': '海南',
  '50': '重庆',
  '51': '四川',
  '52': '贵州',
  '53': '云南',
  '54': '西藏',
  '61': '陕西',
  '62': '甘肃',
  '63': '青海',
  '64': '宁夏',
  '65': '新疆',
  '71': '台湾',
  '81': '香港',
  '82': '澳门',
  '91': '海外'
};
function getPhoneNumberProvince(phoneNumber) {
  var provinceCode = phoneNumber.substr(3, 2);
  return provinces[provinceCode] ? provinces[provinceCode] : '未知地区';
}
var provinceCounts = {
  '北京': 0,
  '天津': 0,
  '河北': 0,
  '山西': 0,
  '内蒙古': 0,
  '辽宁': 0,
  '吉林': 0,
  '黑龙江': 0,
  '上海': 0,
  '江苏': 0,
  '浙江': 0,
  '安徽': 0,
  '福建': 0,
  '江西': 0,
  '山东': 0,
  '河南': 0,
  '湖北': 0,
  '湖南': 0,
  '广东': 0,
  '广西': 0,
  '海南': 0,
  '重庆': 0,
  '四川': 0,
  '贵州': 0,
  '云南': 0,
  '西藏': 0,
  '陕西': 0,
  '甘肃': 0,
  '青海': 0,
  '宁夏': 0,
  '新疆': 0,
  '台湾': 0,
  '香港': 0,
  '澳门': 0,
  '海外': 0
};
for (var i = 0; i < 1000; i++) {
  var province = getPhoneNumberProvince(phoneNumbers[i]);
  provinceCounts[province]++;
}

四、重复号码

这1000个随机手机号码中是否存在重复号码,可以通过哈希表实现:

function hasDuplicatePhoneNumber(phoneNumbers) {
  var hashTable = {};
  for (var i = 0; i < phoneNumbers.length; i++) {
    if (hashTable[phoneNumbers[i]]) {
      return true;
    } else {
      hashTable[phoneNumbers[i]] = true;
    }
  }
  return false;
}

如果 hasDuplicatePhoneNumber 返回 true,则说明存在重复号码。

五、手机号码生成

如果需要生成指定数量的随机手机号码,可以采用以下方法:

  1. 保证前两位为11
function generateMobilePhoneNumber() {
  var phoneNumber = '11';
  for (var i = 0; i < 9; i++) {
    phoneNumber += Math.floor(Math.random() * 10);
  }
  return phoneNumber;
}
  1. 保证前三位为运营商
var mobileServiceProviderNumberMap = {
  '中国移动': /^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|184|187|188|147|178)/,
  '中国联通': /^(130|131|132|155|156|185|186|145|176)/,
  '中国电信': /^(133|153|180|181|189|177|173|149)/
};
function generateMobilePhoneNumber(serviceProvider) {
  if (!mobileServiceProviderNumberMap[serviceProvider]) {
    return '';
  }
  var phoneNumber = mobileServiceProviderNumberMap[serviceProvider].toString().substr(1);
  for (var i = 0; i < 8; i++) {
    phoneNumber += Math.floor(Math.random() * 10);
  }
  return phoneNumber;
}
  1. 可以指定手机号的前7位
function generateMobilePhoneNumber(prefix) {
  if (!/^[0-9]{7}$/.test(prefix)) {
    return '';
  }
  var phoneNumber = prefix;
  for (var i = 0; i < 4; i++) {
    phoneNumber += Math.floor(Math.random() * 10);
  }
  return phoneNumber;
}