生成一个5-20个字符长度的随机密码，密码应至少包含1个特殊字符、1个数字和1个大写字母。
生成一个随机密码可以使用以下Python代码：

```python
import random
import string

# 定义密码长度
length = random.randint(5, 20)

# 定义密码字符集
lowercase = string.ascii_lowercase
uppercase = string.ascii_uppercase
digits = string.digits
special_chars = string.punctuation

# 定义最少需要包含一个的字符类型
at_least_one = [random.choice(lowercase),
                random.choice(uppercase),
                random.choice(digits),
                random.choice(special_chars)]

# 随机生成剩余字符
for i in range(length - 4):
    at_least_one.append(random.choice(string.ascii_letters + digits + special_chars))

# 随机打乱字符顺序
random.shuffle(at_least_one)

# 连接字符，生成密码
password = ''.join(at_least_one)
```

这段代码利用 Python 自带的 `random` 模块和 `string` 模块生成一个随机密码。其中，`random.randint(5, 20)` 随机生成密码长度，`string.ascii_lowercase`、`string.ascii_uppercase`、`string.digits`、`string.punctuation`分别定义了小写字母、大写字母、数字和特殊字符的字符集。使用 `random.choice()` 函数从这些字符集中随机选择字符，组成密码。最后使用 `random.shuffle()` 函数随机打乱字符顺序，防止密码有规律可循。用字符串的 `join()` 方法将字符连接起来，生成密码。