如何获得类似输入格式的随机相似整数?
How to get random similar integers of the format like input?
假设我有一个像 20.65
这样的十进制数。我想得到 x 个随机十进制数如下:
- 应该有相同的位数。
- 应该有相同的小数位数。
- 如果输入的整数为负数,则应为负数。
- 任何输出都不应重复或与输入相同。
例子
我给出了这样的输入:
Enter number : 50.26
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
12.36
69.74
58.39
54.56
94.45
例二:
输入:
Enter number : 5650.265
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
1652.326
6925.743
5844.394
5464.562
9448.454
示例 3:
输入:
Enter number : -456
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
-566
-492
-452
-151
-944
我试过的:
from random import randint
n = float(input("Enter number : "))
x = int(input("Enter no of random integers to be generated : "))
min_choice = int('1'+''.join('0' for i in range(len(str(n))-1)))
max_choice = int(''.join('9' for i in range(len(str(n)))))
for i in range(x):
print(randint(min_choice, max_choice))
输出为:
Enter number : 53.25
Enter no of random integers to be generated : 5
44864
29942
25832
20500
68083
所以,因为我无法计算我被击中的小数位。
您可以将输入转换为 str 然后使用 split
user_input = 123.321
input_parts = str(user_input).split('.') # This will return a list ["123", "321"]
然后你可以用 len
得到每个的长度
left_side = len(input_parts[0])
right_side = len(input_parts[1])
使用这些长度生成适当长度的整数并将它们连接起来。
left_num = str(random.randint(10**(left_side - 1),(10**left_side)-1))
right_num = str(random.randint(10**(right_side - 1),(10**right_side)-1))
现在你有 2 个长度合适的数字。加入他们吧。
sides = [left_num, right_num]
merge = '.'.join(sides)
final_num = float(merge)
您可以将其拆分为两个函数,一个用于生成单个数字,另一个用于收集值以确保不包含重复项:
import random
def gen_num(inp):
out = ""
if inp[0] == '-':
out += "-"
inp = inp[1:] # Skip sign
# The loop insures the generated numbers
# are of the same length as inp
for dig in inp:
if dig == ".": # Keeping decimal separator where it was
out += "."
else:
out += str(random.randint(1, 9))
return out
def gen_nums(inp, n):
out = set() # Sets can't contain duplicates
while len(out) < n:
num = gen_num(inp)
if num != inp: # Making sure no output number is same as input
out.add(num)
return out
if __name__ == "__main__":
inp = input("Enter number: ")
n = int(input("Enter no of random numbers to be generated: "))
for v in gen_nums(inp, n):
print(v)
注意不要将输入转换为浮点数再返回,您可能会遇到浮点数错误。
另请注意,在给定约束的情况下可以生成有限数量的数字(您不能从输入 1
生成 9
值)并且您可能想要定义在这种情况下应该发生什么(你认为使用上面的代码会发生什么?)。
假设我有一个像 20.65
这样的十进制数。我想得到 x 个随机十进制数如下:
- 应该有相同的位数。
- 应该有相同的小数位数。
- 如果输入的整数为负数,则应为负数。
- 任何输出都不应重复或与输入相同。
例子
我给出了这样的输入:
Enter number : 50.26
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
12.36
69.74
58.39
54.56
94.45
例二:
输入:
Enter number : 5650.265
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
1652.326
6925.743
5844.394
5464.562
9448.454
示例 3:
输入:
Enter number : -456
Enter no of random numbers to be generated : 5
那么它的输出应该是这样的:
-566
-492
-452
-151
-944
我试过的:
from random import randint
n = float(input("Enter number : "))
x = int(input("Enter no of random integers to be generated : "))
min_choice = int('1'+''.join('0' for i in range(len(str(n))-1)))
max_choice = int(''.join('9' for i in range(len(str(n)))))
for i in range(x):
print(randint(min_choice, max_choice))
输出为:
Enter number : 53.25
Enter no of random integers to be generated : 5
44864
29942
25832
20500
68083
所以,因为我无法计算我被击中的小数位。
您可以将输入转换为 str 然后使用 split
user_input = 123.321
input_parts = str(user_input).split('.') # This will return a list ["123", "321"]
然后你可以用 len
得到每个的长度left_side = len(input_parts[0])
right_side = len(input_parts[1])
使用这些长度生成适当长度的整数并将它们连接起来。
left_num = str(random.randint(10**(left_side - 1),(10**left_side)-1))
right_num = str(random.randint(10**(right_side - 1),(10**right_side)-1))
现在你有 2 个长度合适的数字。加入他们吧。
sides = [left_num, right_num]
merge = '.'.join(sides)
final_num = float(merge)
您可以将其拆分为两个函数,一个用于生成单个数字,另一个用于收集值以确保不包含重复项:
import random
def gen_num(inp):
out = ""
if inp[0] == '-':
out += "-"
inp = inp[1:] # Skip sign
# The loop insures the generated numbers
# are of the same length as inp
for dig in inp:
if dig == ".": # Keeping decimal separator where it was
out += "."
else:
out += str(random.randint(1, 9))
return out
def gen_nums(inp, n):
out = set() # Sets can't contain duplicates
while len(out) < n:
num = gen_num(inp)
if num != inp: # Making sure no output number is same as input
out.add(num)
return out
if __name__ == "__main__":
inp = input("Enter number: ")
n = int(input("Enter no of random numbers to be generated: "))
for v in gen_nums(inp, n):
print(v)
注意不要将输入转换为浮点数再返回,您可能会遇到浮点数错误。
另请注意,在给定约束的情况下可以生成有限数量的数字(您不能从输入 1
生成 9
值)并且您可能想要定义在这种情况下应该发生什么(你认为使用上面的代码会发生什么?)。