V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
IDCFAN
V2EX  ›  程序员

求教怎样可以生成 26 个字母+1 个固定数字的随机字符串

  •  
  •   IDCFAN · 2018-01-26 13:42:05 +08:00 · 3906 次点击
    这是一个创建于 2275 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有点特殊要求:

    1、字串长度 35
    3、包含 A~Z 的大写英文字母
    2、包含数字 5
    4、主要由 A~Z 组成,数字 5 在随机位置出现,出现总次数不超过 5 次。

    搞了一上午发现无法实现,只得来求救了。
    第 1 条附言  ·  2018-01-27 19:17:34 +08:00
    谢谢。各位回复的都送上感谢铜板了。
    15 条回复    2018-01-29 09:22:58 +08:00
    pabupa
        1
    pabupa  
       2018-01-26 13:45:49 +08:00
    …………
    aksoft
        2
    aksoft  
       2018-01-26 13:47:18 +08:00
    …………
    zenxds
        3
    zenxds  
       2018-01-26 13:49:05 +08:00   ❤️ 1
    先生成字母,5 加进去乱序一下不就完了
    MinQ
        4
    MinQ  
       2018-01-26 13:52:44 +08:00   ❤️ 1
    先生成一个 30-34 之间的数字 length,然后生成一个长度为 length 的字符串,由 A-Z 组成,最后看缺几个字符,再随机几次把 5 插进去就行了
    widdy
        5
    widdy  
       2018-01-26 13:53:10 +08:00   ❤️ 1
    你这逻辑都奇怪,主要由 A-Z 组成,又有 5,这不都矛盾的表述,你先把范围确定,然后就从中每次 rand 出来一个,最后在检测有没有 5,5 的次数超过五个没,不符合要求就重新生成得了;
    sunsulei
        6
    sunsulei  
       2018-01-26 13:54:28 +08:00   ❤️ 1
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5
    类似这种也是可以的吗?
    如果必须要出现 26 个全字母然后加一个随机 1/<=5 个 5 的话
    生成随机的 26 个字母的串 再随机 1/<=5 个位置 塞 5 好像也是可以的..
    但是估计 .... 得每次判重了..
    iblessyou
        7
    iblessyou  
       2018-01-26 13:58:39 +08:00   ❤️ 1
    描述的不清晰,最多 5 个 5,加 26=31,字符串 35,也就是字母没次数限制也是随机?如果这样的话
    1 先随出 5 的次数 N,将 N 个 5 放入随机池;
    2 随机在 26 个字母中取 36-N 次,将取到的字母放入随机池;
    3 在随机池里随机取出所有字符组成字符串
    mengyaoss77
        8
    mengyaoss77  
       2018-01-26 14:03:17 +08:00   ❤️ 3
    1 生成长度为 35 的 A-Z 随机字符串
    2 生成数字 5 出现的次数
    3 生成数字 5 出现的位置
    4 替换
    xzc0001
        9
    xzc0001  
       2018-01-26 14:23:34 +08:00   ❤️ 1
    生成长度 35 的字符串
    随机 5 次位置用数字 5 替换
    结束。
    beshe
        10
    beshe  
       2018-01-26 15:29:24 +08:00   ❤️ 1
    python code:

    import string, random
    x = random.randint(30, 35)
    chars=[random.choice(string.ascii_uppercase) for i in xrange(x) ] + [(str(5)) for i in xrange(35-x)]
    random.shuffle(chars)
    print "".join(chars)
    873681136
        11
    873681136  
       2018-01-26 15:50:13 +08:00   ❤️ 1
    1. 随机数字 5 的个数 n
    2. 随机长度为 35-n 的随机字符串 A-Z,在末尾添加长度为 n 的字符串 5
    3. 使用 shuffle 算法打乱
    no1xsyzy
        12
    no1xsyzy  
       2018-01-26 17:02:00 +08:00   ❤️ 1
    如果先随机长度,P("A"*30+"5"*5)不等于 P("A"*31+"5"*4)
    bxb100
        13
    bxb100  
       2018-01-27 13:45:39 +08:00 via Android   ❤️ 1
    随机 5 出现的次数,然后随机剩余字母,然后打乱,java,py 都有 api
    buffge
        14
    buffge  
       2018-01-27 18:22:51 +08:00   ❤️ 1
    $cFive = mt_rand(0, 5);
    $cUpchar = 35 - $cFive;
    $chs = [];
    for ($i = 0; $i < $cUpchar; $i++) {
    $chs[] = chr(mt_rand(65, 90));
    }
    for ($i = 0; $i < $cFive; $i++) {
    $location = mt_rand(0, $cUpchar + $i);
    $temp = $chs[$location];
    $chs[$location] = 5;
    $chs[$cUpchar + $i] = $temp;
    }
    print_r($chs);

    写错了 轻喷 新手.
    corningsun
        15
    corningsun  
       2018-01-29 09:22:58 +08:00
    package com.v2ex.random1;

    import org.apache.commons.lang3.RandomStringUtils;
    import org.apache.commons.lang3.RandomUtils;

    /**
    * Created by corning on 2018/1/29.
    */
    public class Random1 {

    public static final String A_Z = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    /**
    * 生成随机字符串,包含 A-Z 和指定数字
    *
    * @param fullLen 字符串总长度
    * @param num 指定的数字
    * @param numLen 指定数字出现最大次数
    * @return
    */
    public static String randomAlphabetWithNum(int fullLen, int num, int numLen) {
    // 数字出现次数是随机的
    int numRealLen = RandomUtils.nextInt(1, numLen);
    // 根据数字出现次数,计算字符串出现次数
    int strRealLen = fullLen - numRealLen;
    String randomStr = RandomStringUtils.random(strRealLen, A_Z);
    // 在字符串中,随机获取下标并插入数字
    StringBuffer sb = new StringBuffer(randomStr);
    for (int i = 0; i < numRealLen; i++) {
    int randomOffset = RandomUtils.nextInt(0, sb.length() + 1);
    sb.insert(randomOffset, num);
    }
    return sb.toString();
    }

    public static void main(String[] args) {
    for (int i = 0; i < 10; i++) {
    System.out.println(Random1.randomAlphabetWithNum(35, 5, 5));
    }
    }

    }

    // 测试结果
    // LMKABJN5YTKICAXS5E55ZXHJOBQTJQPVXYT
    // RVLGQJHSQSXGXGXSOIIHRNLBPBYCPBBWY5L
    // KUFB5RNCHTNSYUPPUD5NDGIVFHR5RCCLFVQ
    // GJJMJGAEFPXEA5MZS5YTNBUHO5DWCXKJYSB
    // UIDXJPI5QOKF5QNPUUCDCZ5JDKTDZYJPUDI
    // FIBULFHIY5ZJH5XRZOMKN5EHEJOPDUECCTL
    // U5YDH5RRIRXEVNRPCEP5PNSKBGPQWGV5CBJ
    // SEQ5LAFZT55WKBRKBLSJBA5FYQJSHZJLNBM
    // MVW5NT5RJAUVHSKLQKMDKARSHHBRNRKGGAW
    // VKZIKYRXSW5XIOGR5AEFBRMKWFZV5LIORMZ
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2823 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:56 · PVG 19:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.