Table des matières
回复内容:
Maison développement back-end tutoriel php 生成随机数,怎么留下一些比较顺的数字。

生成随机数,怎么留下一些比较顺的数字。

Jun 06, 2016 pm 08:38 PM
java mysql php postgresql python

有一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)来匹配三位递增的情况。

  1. 设计不让用户使用的号码正则表达式,还可以考虑维护号码黑名单
  2. random随机生成号码,并检查是否在黑名单中存在以及是否在数据库中存在,如果存在则重新调用生成函数
  3. 生成的号码存入数据库

其實就是「僞」隨機串,像 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>
Copier après la connexion

隨便找了幾個數試試,結果如下:

<code>Object {8888: true, 10000: true, 100001: true, 1112111: true, 12345678: true, 342333423: false, 657865789: false}
</code>
Copier après la connexion

用以上代碼,數字不像「隨機」(也就是漂亮)程度也差不多有了,再加上對單個數字的權重,加權計算就可以得到數字的「順」度。

本来看到这么多回复都不想写了,但是感觉回答都有点绕。。。

这个问题核心要分解成两个子问题:
1. 什么样的号码才是好的号码?
2. 怎么把这些好的号码可以实现单独分配?

对于问题一,这个想完全智能化是基本不可能的,需要用到人的知识,所以肯定是你例举所有好号码的规则,再去匹配满足这个规则的数字。比如说ABAB,ABBB,AABB,AAAA等,还有可能是包含8或6的数量等。
这种编写代码的时候,就统一对boolean isAwesomeNumber(String number)的接口做一堆实现,然后逐一匹配,就类似templete模式的方式即可。

对于问题二,要看你的业务逻辑,如果是卖手机号,那需要提前帅选出来进行分类,那就输入一个号码段,执行上述方法判断是否满足好号码的任意规则。输出的结果就实现了预期功能了。

  1. 首先要自己制定一下“比较顺的数字”的标准。
  2. 每次生成之前,判断一下是否满足标准。如果满足就往后推一位,再判断…… 直到找到普通数字为止。
  3. 题目是“生成随机数”。如果要完全随机,又要全局唯一的话,随机的结果出来需要判重,比如找“比这个数大而没有重的最小的数”。感觉性能比不随机要略差一些。
  4. 题目里说是“APP需求”,感觉最好在服务端生成这个数,而不是 APP 端。

随机生成,过滤已经生成过的和要留的就行了,贴段Java实现:

RandomStringUtils.randomNumeric(8)

使用了:commons-lang3

对你的问题比较感兴趣, 打算写个类库. 先留个坑, 等写完了会附上地址和使用方法. 所以我先说我的一下思路:

判断好坏是机器来判断, 所以如果是一个单纯的判断好/不好的bool值, 我想也没有多大意义, 因为这样做仅仅是一个过滤器, 无法判断好且好到什么程度, 我的想法有两点:

  1. 可以检查数字串是否为某类型, 如123 = ABC, 456 = AABB
  2. 对给定的数字串进行处理, 最后得出其规律, 如 ABC, AAA, AABB
  3. 对给出的数字串进行处理, 最后给出一个整数型的输出代表其好坏程度

对于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>
Copier après la connexion
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment construire une base de données SQL Comment construire une base de données SQL Apr 09, 2025 pm 04:24 PM

La construction d'une base de données SQL comprend 10 étapes: sélectionner des SGBD; Installation de SGBD; créer une base de données; créer une table; insérer des données; récupération de données; Mise à jour des données; supprimer des données; gérer les utilisateurs; sauvegarde de la base de données.

MySQL: Concepts simples pour l'apprentissage facile MySQL: Concepts simples pour l'apprentissage facile Apr 10, 2025 am 09:29 AM

MySQL est un système de gestion de base de données relationnel open source. 1) Créez une base de données et des tables: utilisez les commandes CreateDatabase et CreateTable. 2) Opérations de base: insérer, mettre à jour, supprimer et sélectionner. 3) Opérations avancées: jointure, sous-requête et traitement des transactions. 4) Compétences de débogage: vérifiez la syntaxe, le type de données et les autorisations. 5) Suggestions d'optimisation: utilisez des index, évitez de sélectionner * et utilisez les transactions.

MySQL et SQL: Compétences essentielles pour les développeurs MySQL et SQL: Compétences essentielles pour les développeurs Apr 10, 2025 am 09:30 AM

MySQL et SQL sont des compétences essentielles pour les développeurs. 1.MySQL est un système de gestion de base de données relationnel open source, et SQL est le langage standard utilisé pour gérer et exploiter des bases de données. 2.MySQL prend en charge plusieurs moteurs de stockage via des fonctions de stockage et de récupération de données efficaces, et SQL termine des opérations de données complexes via des instructions simples. 3. Les exemples d'utilisation comprennent les requêtes de base et les requêtes avancées, telles que le filtrage et le tri par condition. 4. Les erreurs courantes incluent les erreurs de syntaxe et les problèmes de performances, qui peuvent être optimisées en vérifiant les instructions SQL et en utilisant des commandes Explication. 5. Les techniques d'optimisation des performances incluent l'utilisation d'index, d'éviter la numérisation complète de la table, d'optimiser les opérations de jointure et d'améliorer la lisibilité du code.

PHP vs Python: comprendre les différences PHP vs Python: comprendre les différences Apr 11, 2025 am 12:15 AM

PHP et Python ont chacun leurs propres avantages, et le choix doit être basé sur les exigences du projet. 1.Php convient au développement Web, avec une syntaxe simple et une efficacité d'exécution élevée. 2. Python convient à la science des données et à l'apprentissage automatique, avec une syntaxe concise et des bibliothèques riches.

L'avenir de PHP: adaptations et innovations L'avenir de PHP: adaptations et innovations Apr 11, 2025 am 12:01 AM

L'avenir de PHP sera réalisé en s'adaptant aux nouvelles tendances technologiques et en introduisant des fonctionnalités innovantes: 1) s'adapter aux architectures de cloud computing, de conteneurisation et de microservice, en prenant en charge Docker et Kubernetes; 2) introduire des compilateurs JIT et des types d'énumération pour améliorer l'efficacité des performances et du traitement des données; 3) Optimiser en continu les performances et promouvoir les meilleures pratiques.

PHP: Est-il en train de mourir ou est-ce simplement de s'adapter? PHP: Est-il en train de mourir ou est-ce simplement de s'adapter? Apr 11, 2025 am 12:13 AM

Le PHP n'est pas en train de mourir, mais d'adapter et d'évoluer constamment. 1) PHP a subi plusieurs itérations de version depuis 1994 pour s'adapter aux nouvelles tendances technologiques. 2) Il est actuellement largement utilisé dans le commerce électronique, les systèmes de gestion de contenu et d'autres domaines. 3) PHP8 introduit le compilateur JIT et d'autres fonctions pour améliorer les performances et la modernisation. 4) Utilisez OPCACHE et suivez les normes PSR-12 pour optimiser les performances et la qualité du code.

Comment importer des fichiers SQL dans la base de données Comment importer des fichiers SQL dans la base de données Apr 09, 2025 pm 04:27 PM

L'importation de fichiers SQL vous permet de charger des instructions SQL à partir de fichiers texte dans une base de données. Les étapes incluent: Connectez-vous à la base de données. Préparez le fichier SQL pour vous assurer qu'il est valide et l'instruction se termine par un point-virgule. Importez des fichiers via la ligne de commande ou les outils clients de la base de données. Interrogez les résultats de l'importation de vérification de la base de données.

MySQL: une introduction conviviale aux bases de données MySQL: une introduction conviviale aux bases de données Apr 10, 2025 am 09:27 AM

L'installation et les opérations de base de MySQL incluent: 1. Télécharger et installer MySQL, définir le mot de passe de l'utilisateur racine; 2. Utilisez des commandes SQL pour créer des bases de données et des tables, telles que CreateDatabase et CreateTable; 3. Exécuter les opérations CRUD, utiliser des commandes INSERT, SELECT, UPDATE, DELETE; 4. Créer des index et des procédures stockées pour optimiser les performances et implémenter une logique complexe. Avec ces étapes, vous pouvez créer et gérer les bases de données MySQL à partir de zéro.

See all articles