Jadual Kandungan
回复内容:
Rumah pembangunan bahagian belakang tutorial 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>
Salin selepas log masuk

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

<code>Object {8888: true, 10000: true, 100001: true, 1112111: true, 12345678: true, 342333423: false, 657865789: false}
</code>
Salin selepas log masuk

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

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

这个问题核心要分解成两个子问题:
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>
Salin selepas log masuk
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tidak dapat log masuk ke mysql sebagai akar Tidak dapat log masuk ke mysql sebagai akar Apr 08, 2025 pm 04:54 PM

Sebab utama mengapa anda tidak boleh log masuk ke MySQL sebagai akar adalah masalah kebenaran, ralat fail konfigurasi, kata laluan tidak konsisten, masalah fail soket, atau pemintasan firewall. Penyelesaiannya termasuk: periksa sama ada parameter pengikat di dalam fail konfigurasi dikonfigurasi dengan betul. Semak sama ada kebenaran pengguna root telah diubahsuai atau dipadam dan ditetapkan semula. Sahkan bahawa kata laluan adalah tepat, termasuk kes dan aksara khas. Semak tetapan dan laluan kebenaran fail soket. Semak bahawa firewall menyekat sambungan ke pelayan MySQL.

mysql sama ada untuk menukar jadual kunci meja mysql sama ada untuk menukar jadual kunci meja Apr 08, 2025 pm 05:06 PM

Apabila MySQL mengubahsuai struktur jadual, kunci metadata biasanya digunakan, yang boleh menyebabkan jadual dikunci. Untuk mengurangkan kesan kunci, langkah -langkah berikut boleh diambil: 1. Simpan jadual yang tersedia dengan DDL dalam talian; 2. Melakukan pengubahsuaian kompleks dalam kelompok; 3. Beroperasi semasa tempoh kecil atau luar puncak; 4. Gunakan alat PT-OSC untuk mencapai kawalan yang lebih baik.

Pengoptimuman pertanyaan di MySQL adalah penting untuk meningkatkan prestasi pangkalan data, terutama ketika berurusan dengan set data yang besar Pengoptimuman pertanyaan di MySQL adalah penting untuk meningkatkan prestasi pangkalan data, terutama ketika berurusan dengan set data yang besar Apr 08, 2025 pm 07:12 PM

1. Gunakan indeks yang betul untuk mempercepatkan pengambilan data dengan mengurangkan jumlah data yang diimbas memilih*frommployeesWherElast_name = 'Smith'; Jika anda melihat lajur jadual beberapa kali, buat indeks untuk lajur tersebut. Jika anda atau aplikasi anda memerlukan data dari pelbagai lajur mengikut kriteria, buat indeks komposit 2. Elakkan pilih * Hanya lajur yang diperlukan, jika anda memilih semua lajur yang tidak diingini, ini hanya akan memakan lebih banyak pelayan dan menyebabkan pelayan melambatkan pada masa yang tinggi atau kekerapan misalnya, jadual anda

Hubungan antara pengguna dan pangkalan data MySQL Hubungan antara pengguna dan pangkalan data MySQL Apr 08, 2025 pm 07:15 PM

Dalam pangkalan data MySQL, hubungan antara pengguna dan pangkalan data ditakrifkan oleh kebenaran dan jadual. Pengguna mempunyai nama pengguna dan kata laluan untuk mengakses pangkalan data. Kebenaran diberikan melalui perintah geran, sementara jadual dibuat oleh perintah membuat jadual. Untuk mewujudkan hubungan antara pengguna dan pangkalan data, anda perlu membuat pangkalan data, membuat pengguna, dan kemudian memberikan kebenaran.

Integrasi RDS MySQL dengan Redshift Zero ETL Integrasi RDS MySQL dengan Redshift Zero ETL Apr 08, 2025 pm 07:06 PM

Penyederhanaan Integrasi Data: AmazonRDSMYSQL dan Integrasi Data Integrasi Zero ETL Redshift adalah di tengah-tengah organisasi yang didorong oleh data. Proses tradisional ETL (ekstrak, menukar, beban) adalah kompleks dan memakan masa, terutamanya apabila mengintegrasikan pangkalan data (seperti Amazonrdsmysql) dengan gudang data (seperti redshift). Walau bagaimanapun, AWS menyediakan penyelesaian integrasi ETL sifar yang telah mengubah keadaan ini sepenuhnya, menyediakan penyelesaian yang mudah, hampir-sebenar untuk penghijrahan data dari RDSMYSQL ke redshift. Artikel ini akan menyelam ke integrasi RDSMYSQL Zero ETL dengan redshift, menjelaskan bagaimana ia berfungsi dan kelebihan yang dibawa kepada jurutera dan pemaju data.

Adakah Mysql perlu membayar Adakah Mysql perlu membayar Apr 08, 2025 pm 05:36 PM

MySQL mempunyai versi komuniti percuma dan versi perusahaan berbayar. Versi komuniti boleh digunakan dan diubahsuai secara percuma, tetapi sokongannya terhad dan sesuai untuk aplikasi dengan keperluan kestabilan yang rendah dan keupayaan teknikal yang kuat. Edisi Enterprise menyediakan sokongan komersil yang komprehensif untuk aplikasi yang memerlukan pangkalan data yang stabil, boleh dipercayai, berprestasi tinggi dan bersedia membayar sokongan. Faktor yang dipertimbangkan apabila memilih versi termasuk kritikal aplikasi, belanjawan, dan kemahiran teknikal. Tidak ada pilihan yang sempurna, hanya pilihan yang paling sesuai, dan anda perlu memilih dengan teliti mengikut keadaan tertentu.

Bolehkah mysql berjalan di Android Bolehkah mysql berjalan di Android Apr 08, 2025 pm 05:03 PM

MySQL tidak boleh berjalan secara langsung di Android, tetapi ia boleh dilaksanakan secara tidak langsung dengan menggunakan kaedah berikut: menggunakan pangkalan data ringan SQLite, yang dibina di atas sistem Android, tidak memerlukan pelayan yang berasingan, dan mempunyai penggunaan sumber kecil, yang sangat sesuai untuk aplikasi peranti mudah alih. Sambungkan jauh ke pelayan MySQL dan sambungkan ke pangkalan data MySQL pada pelayan jauh melalui rangkaian untuk membaca dan menulis data, tetapi terdapat kelemahan seperti kebergantungan rangkaian yang kuat, isu keselamatan dan kos pelayan.

Bagaimana untuk mengoptimumkan prestasi MySQL untuk aplikasi beban tinggi? Bagaimana untuk mengoptimumkan prestasi MySQL untuk aplikasi beban tinggi? Apr 08, 2025 pm 06:03 PM

Panduan Pengoptimuman Prestasi Pangkalan Data MySQL Dalam aplikasi yang berintensifkan sumber, pangkalan data MySQL memainkan peranan penting dan bertanggungjawab untuk menguruskan urus niaga besar-besaran. Walau bagaimanapun, apabila skala aplikasi berkembang, kemunculan prestasi pangkalan data sering menjadi kekangan. Artikel ini akan meneroka satu siri strategi pengoptimuman prestasi MySQL yang berkesan untuk memastikan aplikasi anda tetap cekap dan responsif di bawah beban tinggi. Kami akan menggabungkan kes-kes sebenar untuk menerangkan teknologi utama yang mendalam seperti pengindeksan, pengoptimuman pertanyaan, reka bentuk pangkalan data dan caching. 1. Reka bentuk seni bina pangkalan data dan seni bina pangkalan data yang dioptimumkan adalah asas pengoptimuman prestasi MySQL. Berikut adalah beberapa prinsip teras: Memilih jenis data yang betul dan memilih jenis data terkecil yang memenuhi keperluan bukan sahaja dapat menjimatkan ruang penyimpanan, tetapi juga meningkatkan kelajuan pemprosesan data.

See all articles