0

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

2 回答 2

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。因此,您正在创建一个临时列表,对其进行洗牌,然后丢失对它的任何引用。

顺便说一句,如果需要:

>>> ''.join(s)
'JPFM3QKP2K7JBPXGMBK99B8V8'
于 2013-05-12T22:12:23.940 回答
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;
    }
}
于 2013-05-12T22:14:37.650 回答