具有限制的字母数字发生器

时间:2013-05-12 22:00:03

标签: c++ python

我想创建一个使用这些字符的生成器: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)

2 个答案:

答案 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;
    }
}