Function 生成不同数字的随机数

Function 生成不同数字的随机数,function,python-2.7,loops,random,while-loop,Function,Python 2.7,Loops,Random,While Loop,所以我需要写一个程序,生成从100到999的随机数,棘手的是数字中的数字不能相同 例如:222、212等是不允许的 到目前为止,我有: 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 !

所以我需要写一个程序,生成从100到999的随机数,棘手的是数字中的数字不能相同

例如:222、212等是不允许的

到目前为止,我有:

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++中,我用“while循环”来完成这个操作。在这里我不知道怎么做

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

附言。
谢谢你们的回答和建议,我非常喜欢学习新的技术和代码

在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('%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
如果无法转换该值,则会出现异常;您可以捕获异常并循环生成数字

将其与典型的主要结构结合起来:

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()

要循环直到一切正常,您也可以在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('%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
如果无法转换该值,则会出现异常;您可以捕获异常并循环生成数字

将其与典型的主要结构结合起来:

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()
使用random.sample从分布[0,9]中进行采样可能更容易,无需替换,拒绝任何先选择0的样本:

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

从分布[0,9]中使用random.sample-to-sample可能更容易,无需替换,拒绝任何先选择0的样本:


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

创建一个数字列表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

这个答案与execpt非常相似,它使用的是在2.3之前的版本中可以使用的shuffle方法,它不会循环等待非0的第一位数字。

不是生成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

这个答案与execpt非常相似,它使用了在2.3之前的版本中可以使用的方法shuffle,并且它不会循环等待非0的第一位数字。

在@xnx answer的顶部,有一些背景:这被称为Fisher-Yates或F-Y-Knuth shuffle,类似于随机挑选彩票,只使用一次彩票。关于复杂性,这里要阅读更多内容

除了@xnx答案,还有一些背景:这被称为Fisher-Yates或F-Y-Knuth shuffle,类似于随机挑选彩票,只使用一次彩票。关于复杂性,请在此阅读更多内容

谢谢你们两位^^你们真的帮助了我。我不知道,也许我很乐观,但到目前为止,我真的很接近弗朗西斯·科拉斯所写的代码……再次感谢你:我只是不喜欢一件事,它打印的数字是这样的[1,0,9],而不是这样的10 9是的,我知道它们是独立的数字,但可能会有更好的结果?XXX,我不知道为什么,但是…这个for for循环的工作方式很奇怪,与C++相比,我认为我可能做了一些错事,因为
我正在尝试将这个“n”作为键盘的输入…谢谢你们俩^^你们真的帮助了我。我不知道,也许我很乐观,但到目前为止,我真的很接近弗朗西斯·科拉斯所写的代码……再次感谢你:我只是不喜欢一件事,它打印的数字是这样的[1,0,9],而不是这样的10 9是的,我知道它们是独立的数字,但可能会有更好的结果?XXX,我不知道为什么,但是…这个for for循环的工作方式很奇怪,和C++相比,我想我可能做了一些错事,因为我试图把这个“n”作为键盘的输入…进一步解释一下你的代码到底做了什么可能会有帮助。进一步解释一下你的代码到底做了什么可能会有帮助。所以你不是真的生成随机数。所以你不是真的生成随机数。