生成随机数,怎么留下一些比较顺的数字。
有一APP需求,要求生成全局唯一号码(类似QQ号),但是要把好的号码预先留下或者在用户注册的时候判断将要 获取的号码是不是好号码。。。
这个怎么做?
比如8位开始,像88888888,12345678,11111111,22222222,33333333,10000001都不能给用户……
java PostgreSQL python php mysql
Answers
对你的问题比较感兴趣, 打算写个类库. 先留个坑, 等写完了会附上地址和使用方法. 所以我先说我的一下思路:
判断好坏是机器来判断, 所以如果是一个单纯的判断好/不好的bool值, 我想也没有多大意义, 因为这样做仅仅是一个过滤器, 无法判断好且好到什么程度, 我的想法有两点:
- 可以检查数字串是否为某类型, 如123 = ABC, 456 = AABB
- 对给定的数字串进行处理, 最后得出其规律, 如 ABC, AAA, AABB
- 对给出的数字串进行处理, 最后给出一个整数型的输出代表其好坏程度
对于3来说, 还涉及的一个问题是单个数字, 如8 对应的权值应该会大那么一点点
其實就是「僞」隨機串,像 iPod 那樣自動過濾掉諸如「ABC」、「ABCABC」之類不「隨機」的隨機串。
只要寫一個判斷是否「不像隨機」用的方法,只要滿足就自動重新生成。
根據你的描述,「不像隨機」的串應該包括:
-
單個數的重複,如 88888888
-
連續遞增遞減的,如 12345678
-
「整」數,如 10000000
-
迴文數,如 10000001
代碼如下:
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 < n; ++i) {
if (str[i] !== first)
return false;
}
return true;
}
function isSeries(str) {
var series1 = 1 * str[0],
series2 = 1 * str[0];
for (var i = 1, n = str.length; i < n; ++i) {
var j = 1 * str[i];
if (j !== ++series1 && j !== --series2)
return false;
}
return true;
}
function isIdealInteger(str) {
for (var i = 1, n = str.length; i < n; ++i) {
if (str[i] !== "0")
return false;
}
return true;
}
function isPalindromic(str) {
for (var i = 0, n = str.length, n2 = n/2; i < n2; ++i) {
if (str[i] !== str[n - 1 - i])
return false;
}
return true;
}
隨便找了幾個數試試,結果如下:
Object {8888: true, 10000: true, 100001: true, 1112111: true, 12345678: true, 342333423: false, 657865789: false}
用以上代碼,數字不像「隨機」(也就是漂亮)程度也差不多有了,再加上對單個數字的權重,加權計算就可以得到數字的「順」度。
楼主的真正问题是:如何确定一个数是否“好数”,而不是已知一堆好数如何筛掉(那还不容易?)。
这个问题很普遍,我相信QQ和电信运营商都经历过相同的问题。简单地设定一些规则是可行的,但肯定不全,无可避免会漏掉一些。
最关键的,很多时候不但要区别哪些数漂亮,还得确定它的“漂亮程度”。
我能给出的解决方案是,开发个爬虫,获取该数字相关的域名、QQ号、手机号是否已被注册、注册时间是什么、价格是多少。例如www.12345678.com肯定超贵的对不对?
把数据爬下来后给定一个“指标”进行排序,所谓指标可以就是价格,排名靠前的数就是“好数”了。如果有兴趣研究下去,可以根据这个排名归纳出一系列规则,例如“位数”、“重复数字的个数”等等,然后将这些规则作为输入,“指标”作为输出,使用机械学习的方法计算每一个规则的权重,如果你能组织出足够强大的神经网络,还可以直接把整个数作为输入。
但这种问题肯定有人研究过的对不对?所以做这些工作之前——先找论文!