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

2018-01-26 13:42:05 +08:00
 IDCFAN
有点特殊要求:

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

搞了一上午发现无法实现,只得来求救了。
3913 次点击
所在节点    程序员
15 条回复
pabupa
2018-01-26 13:45:49 +08:00
…………
aksoft
2018-01-26 13:47:18 +08:00
…………
zenxds
2018-01-26 13:49:05 +08:00
先生成字母,5 加进去乱序一下不就完了
MinQ
2018-01-26 13:52:44 +08:00
先生成一个 30-34 之间的数字 length,然后生成一个长度为 length 的字符串,由 A-Z 组成,最后看缺几个字符,再随机几次把 5 插进去就行了
widdy
2018-01-26 13:53:10 +08:00
你这逻辑都奇怪,主要由 A-Z 组成,又有 5,这不都矛盾的表述,你先把范围确定,然后就从中每次 rand 出来一个,最后在检测有没有 5,5 的次数超过五个没,不符合要求就重新生成得了;
sunsulei
2018-01-26 13:54:28 +08:00
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5
类似这种也是可以的吗?
如果必须要出现 26 个全字母然后加一个随机 1/<=5 个 5 的话
生成随机的 26 个字母的串 再随机 1/<=5 个位置 塞 5 好像也是可以的..
但是估计 .... 得每次判重了..
iblessyou
2018-01-26 13:58:39 +08:00
描述的不清晰,最多 5 个 5,加 26=31,字符串 35,也就是字母没次数限制也是随机?如果这样的话
1 先随出 5 的次数 N,将 N 个 5 放入随机池;
2 随机在 26 个字母中取 36-N 次,将取到的字母放入随机池;
3 在随机池里随机取出所有字符组成字符串
mengyaoss77
2018-01-26 14:03:17 +08:00
1 生成长度为 35 的 A-Z 随机字符串
2 生成数字 5 出现的次数
3 生成数字 5 出现的位置
4 替换
xzc0001
2018-01-26 14:23:34 +08:00
生成长度 35 的字符串
随机 5 次位置用数字 5 替换
结束。
beshe
2018-01-26 15:29:24 +08:00
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
2018-01-26 15:50:13 +08:00
1. 随机数字 5 的个数 n
2. 随机长度为 35-n 的随机字符串 A-Z,在末尾添加长度为 n 的字符串 5
3. 使用 shuffle 算法打乱
no1xsyzy
2018-01-26 17:02:00 +08:00
如果先随机长度,P("A"*30+"5"*5)不等于 P("A"*31+"5"*4)
bxb100
2018-01-27 13:45:39 +08:00
随机 5 出现的次数,然后随机剩余字母,然后打乱,java,py 都有 api
buffge
2018-01-27 18:22:51 +08:00
$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
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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426135

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX