我想创建一个使用这些字符的生成器:B C D F G H J K M P Q R T V W X Y Z 2 3 4 6 7 8 9
我希望它从列表中选择18个随机字母,从列表中选择7个随机数并将它们混合在一起(共25个)。可以重复。 Python或C ++。请帮助!
python代码尝试:
import string
import random
letters = [random.choice('BCDFGHJKMPQRTVWXYZ') for x in range(18)]
numbers = [random.choice('2346789') for x in range(7)]
random.shuffle(letters + numbers)
答案 0 :(得分:4)
你几乎没错:
>>> import random
>>> letters = [random.choice('BCDFGHJKMPQRTVWXYZ') for x in range(18)]
>>> numbers = [random.choice('2346789') for x in range(7)]
>>> s = letters + numbers
>>> random.shuffle(s)
>>> s
['J', 'P', 'F', 'M', '3', 'Q', 'K', 'P', '2', 'K', '7', 'J', 'B', 'P', 'X', 'G', 'M', 'B', 'K', '9', '9', 'B', '8', 'V', '8']
random.shuffle(letters+numbers)
有效,但shuffle
就地工作并返回None
。所以你要创建一个临时列表,将其洗牌,然后丢失对它的任何引用。
BTW,如果需要:
>>> ''.join(s)
'JPFM3QKP2K7JBPXGMBK99B8V8'
答案 1 :(得分:0)
在C ++中,至少将它们放在一个数组中,然后循环18次,得到一个带data[rand()%length]
的随机元素,其中length是数组的长度,检查它是否是一个字符,并把它放到进入目的地或再次循环。然后,再次循环,但这次检查它是否是一个字符,并将其放入目的地。
一个例子:
#include <cstdlib>
#include <iostream>
#include <cctype>
#include <ctime>
using namespace std;
int main()
{
srand(time(0));
const int length=25;
char data[]={'B', 'C', /* ... */};
for(int i=0; i<18; ++i)
{
for(char c=data[rand()%length+1];!isalpha(c);); // loop until c is char
cout << c;
}
for(int j=0; j<7; ++j)
{
for(char c=data[rand()%length+1];!isdigit(c););
cout << c;
}
}