2009-01-13 53 views

回答

24

什麼是「隨機小數」?小數具有任意的精確度,因此生成一個具有與Decimal一樣多的隨機數的數字將需要存儲機器的整個內存。

您必須知道您的隨機數中需要多少個精確的小數位數,此時只需抓取一個隨機整數並將其分開即可。例如,如果你希望兩個數字的點上方,兩個數字的部分(參見randrange here):

decimal.Decimal(random.randrange(10000))/100 
15

standard library reference

要從浮創建一個小數,先將其轉換爲字符串。這充當了轉換細節的明確提示(包括表示錯誤)。

>>> import random, decimal 
>>> decimal.Decimal(str(random.random())) 
Decimal('0.467474014342') 

這是你的意思嗎?它看起來不像是我的皮塔餅。您可以將其縮放到您想要的任何範圍和精度。

8

如果你知道你之後加逗號前多少位願意,你可以使用:

>>> import decimal 
>>> import random 
>>> def gen_random_decimal(i,d): 
... return decimal.Decimal('%d.%d' % (random.randint(0,i),random.randint(0,d))) 

... 
>>> gen_random_decimal(9999,999999) #4 digits before, 6 after 
Decimal('4262.786648') 
>>> gen_random_decimal(9999,999999) 
Decimal('8623.79391') 
>>> gen_random_decimal(9999,999999) 
Decimal('7706.492775') 
>>> gen_random_decimal(99999999999,999999999999) #11 digits before, 12 after 
Decimal('35018421976.794013996282') 
>>> 
+1

如果這裏很重要:這個數字的小數部分不是一致隨機的,由於刪除了前導零。你無法獲得'2.0something'。 – bobince 2009-01-13 15:00:44

+0

我也考慮過這個問題,但以(4,6)作爲參數而不是(9999,999999),然後在函數體中使用10 ** 4 - 1,10 ** 6 - 1會更簡單。 – Kiv 2009-01-13 15:06:28

+0

我同意這兩個意見:-) – 2009-01-13 15:07:29

2

隨機模塊有更多提供比「僅返回花車」,但無論如何:

from random import random 
from decimal import Decimal 
randdecimal = lambda: Decimal("%f" % random.random()) 

或者我錯過了你的問題中顯而易見的東西?

2
decimal.Decimal(random.random() * MAX_VAL).quantize(decimal.Decimal('.01')) 
0

另一種使隨機小數的方法。

import random 
round(random.randint(1, 1000) * random.random(), 2) 

在這個例子中,

  • random.randint()生成指定範圍(包含地)隨機整數,
  • random.random()生成隨機漂浮在點數目範圍(0.0,1.0)
  • 最後,round()函數將四捨五入上述乘積的結果(小到254.71921934351644)到小數點後的指定數字(在我們的情況下,我們得到254.71)