有一APP需求,要求生成全局唯一号码(类似QQ号),但是要把好的号码预先留下或者在用户注册的时候判断将要 获取的号码是不是好号码。。。
这个怎么做?
比如8位开始,像88888888,12345678,11111111,22222222,33333333,10000001都不能给用户……
回复内容:
有一APP需求,要求生成全局唯一号码(类似QQ号),但是要把好的号码预先留下或者在用户注册的时候判断将要 获取的号码是不是好号码。。。
这个怎么做?
比如8位开始,像88888888,12345678,11111111,22222222,33333333,10000001都不能给用户……
楼主的真正问题是:如何确定一个数是否“好数”,而不是已知一堆好数如何筛掉(那还不容易?)。
这个问题很普遍,我相信QQ和电信运营商都经历过相同的问题。简单地设定一些规则是可行的,但肯定不全,无可避免会漏掉一些。
最关键的,很多时候不但要区别哪些数漂亮,还得确定它的“漂亮程度”。
我能给出的解决方案是,开发个爬虫,获取该数字相关的域名、QQ号、手机号是否已被注册、注册时间是什么、价格是多少。例如www.12345678.com肯定超贵的对不对?
把数据爬下来后给定一个“指标”进行排序,所谓指标可以就是价格,排名靠前的数就是“好数”了。如果有兴趣研究下去,可以根据这个排名归纳出一系列规则,例如“位数”、“重复数字的个数”等等,然后将这些规则作为输入,“指标”作为输出,使用机械学习的方法计算每一个规则的权重,如果你能组织出足够强大的神经网络,还可以直接把整个数作为输入。
但这种问题肯定有人研究过的对不对?所以做这些工作之前——先找论文!
可以正则表达式筛选。
比如(\d)\1{2,}表示找出同一个数字连续出现3次或以上的情况。(\d)(\d)\1\2表示ABAB的情况等。
当然正则还是有局限性的,比如没法方便的查找顺子等情况。这种情况需要通过生成器生成这类特殊数字拼入正则表达式。比如可以通过拼接生成如下表达式(123|234|345|456|567|678|789)来匹配三位递增的情况。
- 设计不让用户使用的号码正则表达式,还可以考虑维护号码黑名单
- random随机生成号码,并检查是否在黑名单中存在以及是否在数据库中存在,如果存在则重新调用生成函数
- 生成的号码存入数据库
其實就是「僞」隨機串,像 iPod 那樣自動過濾掉諸如「ABC」、「ABCABC」之類不「隨機」的隨機串。
只要寫一個判斷是否「不像隨機」用的方法,只要滿足就自動重新生成。
根據你的描述,「不像隨機」的串應該包括:
單個數的重複,如 88888888
連續遞增遞減的,如 12345678
「整」數,如 10000000
迴文數,如 10000001
代碼如下:
<code>function isPseudo(str) { str = str + ""; return isDuplicate(str) || isSeries(str) || isIdealInteger(str) || isPalindromic(str); } function isDuplicate(str) { var first = str[0]; for (var i = 1, n = str.length; i </code>
隨便找了幾個數試試,結果如下:
<code>Object {8888: true, 10000: true, 100001: true, 1112111: true, 12345678: true, 342333423: false, 657865789: false} </code>
用以上代碼,數字不像「隨機」(也就是漂亮)程度也差不多有了,再加上對單個數字的權重,加權計算就可以得到數字的「順」度。
本来看到这么多回复都不想写了,但是感觉回答都有点绕。。。
这个问题核心要分解成两个子问题:
1. 什么样的号码才是好的号码?
2. 怎么把这些好的号码可以实现单独分配?
对于问题一,这个想完全智能化是基本不可能的,需要用到人的知识,所以肯定是你例举
所有好号码的规则,再去匹配满足这个规则的数字。比如说ABAB,ABBB,AABB,AAAA等,还有可能是包含8或6的数量等。
这种编写代码的时候,就统一对boolean isAwesomeNumber(String number)的接口做一堆实现,然后逐一匹配,就类似templete模式的方式即可。
对于问题二,要看你的业务逻辑,如果是卖手机号,那需要提前帅选出来进行分类,那就输入一个号码段,执行上述方法判断是否满足好号码的任意规则。输出的结果就实现了预期功能了。
- 首先要自己制定一下“比较顺的数字”的标准。
- 每次生成之前,判断一下是否满足标准。如果满足就往后推一位,再判断…… 直到找到普通数字为止。
- 题目是“生成随机数”。如果要完全随机,又要全局唯一的话,随机的结果出来需要判重,比如找“比这个数大而没有重的最小的数”。感觉性能比不随机要略差一些。
- 题目里说是“APP需求”,感觉最好在服务端生成这个数,而不是 APP 端。
随机生成,过滤已经生成过的和要留的就行了,贴段Java
实现:
RandomStringUtils.randomNumeric(8)
使用了:commons-lang3
对你的问题比较感兴趣, 打算写个类库. 先留个坑, 等写完了会附上地址和使用方法. 所以我先说我的一下思路:
判断好坏是机器来判断, 所以如果是一个单纯的判断好/不好的bool值, 我想也没有多大意义, 因为这样做仅仅是一个过滤器, 无法判断好且好到什么程度, 我的想法有两点:
- 可以检查数字串是否为某类型, 如123 = ABC, 456 = AABB
- 对给定的数字串进行处理, 最后得出其规律, 如 ABC, AAA, AABB
- 对给出的数字串进行处理, 最后给出一个整数型的输出代表其好坏程度
对于3来说, 还涉及的一个问题是单个数字, 如8 对应的权值应该会大那么一点点
先写若干规则,
然后从0开始遍历,
符合规则的近白名单
不符合的不管
参考楼上各位回答,需要明确的是以下两个问题
1. 对于好号码的定义,就像AntonyBi所讲『什么样的号码才是好的号码』
2. 如何筛选(生成好号码)
对于问题一。我认为可以直接参考已有的规则(规则针对的是手机号的尾号),毕竟号码的好坏是人的感受。
另外规则不用定太多,链接中的有九条规则,保证了通常来讲最『顺』的号码另作分配,同时用户有可能获得规则外的相对『好』的号码,比如用户在申请时可以随机获得ABAC这样的号码。
对于问题二。
针对普通用户
第一步,随机生成号码。
第二步,判断生成的号码是不是『好』号码。
第三步,是好号码的话,回到第一步,不是到第四步
第四步,返回(返回后需要判断号码有没有被使用)
//假设低级用户可用ABC(123,234,345,...),高级用户可用ABCDE(12345,23456,...)
针对付费用户
第一步,看等级
第二步,根据等级(比如说低级),生成一个或多个随机数(比如说生成的是2,那么ABC就是234)
第三步(可选),看该数符不符合高级用户的规则,符合回到第二步,不符合到第四步
第四步,返回(返回后需要判断号码有没有被使用)
写了个demo判断生成的号码是不是好号码。其他语言的实现也会类似吧。
<code># required para:num,type list of int def is_charm_num(num): def is_AAAA(num): return num[-4] == num[-3] \ and num[-4] == num[-2]\ and num[-4] == num[-1] def is_ABCDE(num): return num[-5] + 1 == num[-4] \ and num[-5] + 2 == num[-3] \ and num[-5] + 3 == num[-2] \ and num[-5] + 4 == num[-1] def is_ABABAB(num): return num[-6] == num[-4] \ and num[-6] == num[-2] \ and num[-5] == num[-3] \ and num[-5] == num[-1] return is_AAAA(num) or is_ABABAB(num) or is_ABCDE(num) if __name__ == '__main__': num = 12345678 num_list = [] #num_list = map(int,str(num)) for n in str(num): num_list.append(int(n)) is_charm_num(num_list) </code>

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境