Inhaltsverzeichnis
回复内容:
Heim Backend-Entwicklung PHP-Tutorial 生成随机数,怎么留下一些比较顺的数字。

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

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>
Nach dem Login kopieren

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

<code>Object {8888: true, 10000: true, 100001: true, 1112111: true, 12345678: true, 342333423: false, 657865789: false}
</code>
Nach dem Login kopieren

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

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

这个问题核心要分解成两个子问题:
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>
Nach dem Login kopieren
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

RDS MySQL -Integration mit RedShift Zero ETL RDS MySQL -Integration mit RedShift Zero ETL Apr 08, 2025 pm 07:06 PM

Vereinfachung der Datenintegration: AmazonRDSMYSQL und Redshifts Null ETL-Integration Die effiziente Datenintegration steht im Mittelpunkt einer datengesteuerten Organisation. Herkömmliche ETL-Prozesse (Extrakt, Konvertierung, Last) sind komplex und zeitaufwändig, insbesondere bei der Integration von Datenbanken (wie AmazonRDSMysQL) in Data Warehouses (wie Rotverschiebung). AWS bietet jedoch keine ETL-Integrationslösungen, die diese Situation vollständig verändert haben und eine vereinfachte Lösung für die Datenmigration von RDSMysQL zu Rotverschiebung bietet. Dieser Artikel wird in die Integration von RDSMYSQL Null ETL mit RedShift eintauchen und erklärt, wie es funktioniert und welche Vorteile es Dateningenieuren und Entwicklern bringt.

Kann MySQL mehrere Verbindungen umgehen? Kann MySQL mehrere Verbindungen umgehen? Apr 08, 2025 pm 03:51 PM

MySQL kann mehrere gleichzeitige Verbindungen verarbeiten und Multi-Threading-/Multi-Processings verwenden, um jeder Client-Anfrage unabhängige Ausführungsumgebungen zuzuweisen, um sicherzustellen, dass sie nicht gestört werden. Die Anzahl der gleichzeitigen Verbindungen wird jedoch von Systemressourcen, MySQL -Konfiguration, Abfrageleistung, Speicher -Engine und Netzwerkumgebung beeinflusst. Die Optimierung erfordert die Berücksichtigung vieler Faktoren wie Codeebene (Schreiben effizienter SQL), Konfigurationsstufe (Anpassung von max_connections), Hardwareebene (Verbesserung der Serverkonfiguration).

MySQL, ob die Tabellenverriegelungstabelle geändert werden soll MySQL, ob die Tabellenverriegelungstabelle geändert werden soll Apr 08, 2025 pm 05:06 PM

Wenn MySQL -Modifys -Tabellenstruktur verwendet werden, werden normalerweise Metadatenverriegelungen verwendet, wodurch die Tabelle gesperrt wird. Um die Auswirkungen von Schlösser zu verringern, können die folgenden Maßnahmen ergriffen werden: 1. Halten Sie Tabellen mit Online -DDL verfügbar; 2. Führen Sie komplexe Modifikationen in Chargen durch; 3.. Arbeiten während kleiner oder absendlicher Perioden; 4. Verwenden Sie PT-OSC-Tools, um eine feinere Kontrolle zu erreichen.

Die Abfrageoptimierung in MySQL ist für die Verbesserung der Datenbankleistung von wesentlicher Bedeutung, insbesondere im Umgang mit großen Datensätzen Die Abfrageoptimierung in MySQL ist für die Verbesserung der Datenbankleistung von wesentlicher Bedeutung, insbesondere im Umgang mit großen Datensätzen Apr 08, 2025 pm 07:12 PM

1. Verwenden Sie den richtigen Index, um das Abrufen von Daten zu beschleunigen, indem die Menge der skanierten Datenmenge ausgewählt wird. Wenn Sie mehrmals eine Spalte einer Tabelle nachschlagen, erstellen Sie einen Index für diese Spalte. Wenn Sie oder Ihre App Daten aus mehreren Spalten gemäß den Kriterien benötigen, erstellen Sie einen zusammengesetzten Index 2. Vermeiden Sie aus. Auswählen * Nur die erforderlichen Spalten. Wenn Sie alle unerwünschten Spalten auswählen, konsumiert dies nur mehr Serverspeicher und veranlasst den Server bei hoher Last oder Frequenzzeiten, beispielsweise die Auswahl Ihrer Tabelle, wie beispielsweise die Spalten wie innovata und updated_at und Zeitsteuer und dann zu entfernen.

Ich kann mich nicht als Stamm bei MySQL anmelden Ich kann mich nicht als Stamm bei MySQL anmelden Apr 08, 2025 pm 04:54 PM

Die Hauptgründe, warum Sie sich bei MySQL nicht als Root anmelden können, sind Berechtigungsprobleme, Konfigurationsdateifehler, Kennwort inkonsistent, Socket -Dateiprobleme oder Firewall -Interception. Die Lösung umfasst: Überprüfen Sie, ob der Parameter Bind-Address in der Konfigurationsdatei korrekt konfiguriert ist. Überprüfen Sie, ob die Root -Benutzerberechtigungen geändert oder gelöscht und zurückgesetzt wurden. Stellen Sie sicher, dass das Passwort korrekt ist, einschließlich Fall- und Sonderzeichen. Überprüfen Sie die Einstellungen und Pfade der Socket -Dateiberechtigte. Überprüfen Sie, ob die Firewall Verbindungen zum MySQL -Server blockiert.

Kann MySQL auf Android laufen? Kann MySQL auf Android laufen? Apr 08, 2025 pm 05:03 PM

MySQL kann nicht direkt auf Android ausgeführt werden, kann jedoch indirekt mit den folgenden Methoden implementiert werden: Die Verwendung der Leichtgewichtsdatenbank SQLite, die auf dem Android -System basiert, benötigt keinen separaten Server und verfügt über eine kleine Ressourcennutzung, die für Anwendungen für Mobilgeräte sehr geeignet ist. Stellen Sie sich remote eine Verbindung zum MySQL -Server her und stellen Sie über das Netzwerk zum Lesen und Schreiben von Daten über das Netzwerk eine Verbindung zur MySQL -Datenbank auf dem Remote -Server her. Es gibt jedoch Nachteile wie starke Netzwerkabhängigkeiten, Sicherheitsprobleme und Serverkosten.

Muss MySQL bezahlen? Muss MySQL bezahlen? Apr 08, 2025 pm 05:36 PM

MySQL hat eine kostenlose Community -Version und eine kostenpflichtige Enterprise -Version. Die Community -Version kann kostenlos verwendet und geändert werden, die Unterstützung ist jedoch begrenzt und für Anwendungen mit geringen Stabilitätsanforderungen und starken technischen Funktionen geeignet. Die Enterprise Edition bietet umfassende kommerzielle Unterstützung für Anwendungen, die eine stabile, zuverlässige Hochleistungsdatenbank erfordern und bereit sind, Unterstützung zu bezahlen. Zu den Faktoren, die bei der Auswahl einer Version berücksichtigt werden, gehören Kritikalität, Budgetierung und technische Fähigkeiten von Anwendungen. Es gibt keine perfekte Option, nur die am besten geeignete Option, und Sie müssen die spezifische Situation sorgfältig auswählen.

Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Wie optimieren Sie die MySQL-Leistung für Hochlastanwendungen? Apr 08, 2025 pm 06:03 PM

Die MySQL-Datenbankleistung Optimierungshandbuch In ressourcenintensiven Anwendungen spielt die MySQL-Datenbank eine entscheidende Rolle und ist für die Verwaltung massiver Transaktionen verantwortlich. Mit der Erweiterung der Anwendung werden jedoch die Datenbankleistung Engpässe häufig zu einer Einschränkung. In diesem Artikel werden eine Reihe effektiver Strategien zur Leistungsoptimierung von MySQL -Leistung untersucht, um sicherzustellen, dass Ihre Anwendung unter hohen Lasten effizient und reaktionsschnell bleibt. Wir werden tatsächliche Fälle kombinieren, um eingehende Schlüsseltechnologien wie Indexierung, Abfrageoptimierung, Datenbankdesign und Caching zu erklären. 1. Das Design der Datenbankarchitektur und die optimierte Datenbankarchitektur sind der Eckpfeiler der MySQL -Leistungsoptimierung. Hier sind einige Kernprinzipien: Die Auswahl des richtigen Datentyps und die Auswahl des kleinsten Datentyps, der den Anforderungen entspricht, kann nicht nur Speicherplatz speichern, sondern auch die Datenverarbeitungsgeschwindigkeit verbessern.

See all articles