带有限制的字母数字生成器

Alphanumeric generator with restrictions

本文关键字:数字 有限制      更新时间:2023-10-16

我想创建一个使用以下字符的生成器:B C D F 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 code attempt:

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)

你几乎是对的:

>>> 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。所以你创建了一个临时列表,打乱了它,然后失去了对它的任何引用。

如果需要的话:

>>> ''.join(s)
'JPFM3QKP2K7JBPXGMBK99B8V8'

至少在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;
    }
}