所以我需要编写一个程序来生成从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 ++中,我使用&#39; while循环 &#39;来实现这一点。在这里,我不知道该怎么做。
还有一个问题。如何编码我想要生成的随机数的数量(数量)? 更具体: 我想生成4个随机数。我该如何编码呢?
P.S。 谢谢大家的回答和建议,我非常热衷于学习新的技术和代码。
答案 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