生成具有不同数字的随机数

时间:2015-03-21 14:25:07

标签: function python-2.7 loops random while-loop

所以我需要编写一个程序来生成从100到999的随机数,而棘手的部分是数字中的数字可以是相同的。

例如:222212等不允许使用。

到目前为止,我有这个:

import random

a = int (random.randint(1,9)) <-- first digit
b = int (random.randint(0,9)) <-- second digit
c = int (random.randint(0,9)) <-- third digit

if (a != b and a != b and b != c):
    print a,b,c

如您所见,我分别生成所有三位数字。我认为检查数字中是否有相同的数字更容易。

所以,现在我想做一个循环来生成数字,直到满足要求(现在它打印空白页或数字)。请注意,它只生成一次,我必须再次打开程序。

在C ++中,我使用&#39; while循环 &#39;来实现这一点。在这里,我不知道该怎么做。

还有一个问题。如何编码我想要生成的随机数的数量(数量)? 更具体: 我想生成4个随机数。我该如何编码呢?​​

P.S。 谢谢大家的回答和建议,我非常热衷于学习新的技术和代码。

4 个答案:

答案 0 :(得分:1)

要循环直到它没问题,你也可以在Python中使用:

from random import randint

a = randint(1, 9)
b = randint(0, 9)
c = randint(0, 9)
while not (a!=b and b!=c and c!=a):
    a = randint(1, 9)
    b = randint(0, 9)
    c = randint(0, 9)

你也可以把它放在一个函数中:

def generate_number():
    a = randint(1, 9)
    b = randint(0, 9)
    c = randint(0, 9)
    while not (a!=b and b!=c and c!=a):
        a = randint(1, 9)
        b = randint(0, 9)
        c = randint(0, 9)
    return (a, b, c)

如果你想要n这样的数字(它们实际上不是数字,因为(a, b, c)是3个int值的元组),你可以称之为n次:

for i in range(n):
    print(generate_number())

如果您更喜欢formatting值,您也可以这样做:

for i in range(n):
    print('%d %d %d'%generate_number()) # old style formatting
    print('{} {} {}'.format(*generate_number())) # new style

最后,您可以从命令行使用get n

import sys
n = sys.argv[1]

或者您可以直接询问:

n = int(input("Please enter some number: ")) # in python2.x you'd use raw_input instead of input

如果无法转换该值,您将收到异常;你可以捕获异常并循环生成数字。

将所有内容与典型的main结构放在一起:

from random import randint
import sys

def generate_number():
    a = randint(1, 9)
    b = randint(0, 9)
    c = randint(0, 9)
    while not (a!=b and b!=c and c!=a):
        a = randint(1, 9)
        b = randint(0, 9)
        c = randint(0, 9)
    return (a, b, c)

def main():
    n = sys.argv[1]
    for i in range(n):
        print('{} {} {}'.format(*generate_number()))

if __name__=='__main__':
    main()

答案 1 :(得分:1)

使用random.sample从分发[0,9]中抽样而不替换可能更容易,拒绝任何首先选择0的样本:

import random

def pick_number():
    a = 0
    while a == 0:
        a, b, c = random.sample(range(10), 3)
    return 100*a + 10*b + c

进一步说明:range(10)(在Python 2中)生成列表[0,1,2,3,4,5,6,7,8,9]random.sample从中选择3个元素而无需替换。 while循环重复,直到第一个元素a不为零,因此当它退出时,您有一个满足要求的数字的三位数。您可以通过将第一个乘以100,将第二个乘以10,然后将所有三个相加,将其转换为单个整数。

答案 2 :(得分:1)

不是生成3个随机数,而是创建0-9的数字列表,然后在其上调用random.shuffle。然后,您只需从洗牌列表中取出所需数量的数字,就不会重复数字

import random

def generate_number():
    numbers = range(10) # Generates a list 0-9
    random.shuffle(numbers) # Shuffle the list

    return (numbers[0], numbers[1], numbers[2]) #take the first 3 items

(这个答案与xnx's answer execpt几乎相同,它使用方法shuffle,它可以在2.3之前的版本中使用,并且它不会循环等待非0的第一个数字。)

答案 3 :(得分:0)

除了@xnx答案之外,还有一些背景:这被称为Fisher-Yates(或F-Y-Knuth)shuffle,它类似于随机选择彩票,只使用一次票。 O(n)复杂性,更多内容请阅读http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle