Seite 1 von 1

Zahl mit einer Millon Stellen

Verfasst: Samstag 12. November 2016, 14:23
von erdal1934
Ich erzeuge eine Zahl mit einer Million Stellen.
Auf meinem Rechner dauert das 5 Minuten.
Kann man das schneller programmieren?

Code: Alles auswählen

num = 0
for i in range(0, 1000*1000)
    num = num*10 + random.randint(0,9)

Re: Zahl mit einer Millon Stellen

Verfasst: Samstag 12. November 2016, 15:05
von Sirius3

Code: Alles auswählen

num = random.randint(0, 10**1000000)
Hat ungefähr 10 Sekunden zu programmieren gedauert. Ein Anfänger kann aber dafür auch 20 brauchen.

Re: Zahl mit einer Millon Stellen

Verfasst: Samstag 12. November 2016, 15:46
von BlackJack
Wobei beide Lösungen auch Zahlen mit weniger als einer Million Stellen erzeugen können. :-)

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 06:34
von erdal1934
Danke, Lösung von sirius braucht nur noch 2 Minuten auf meinem Rechner.

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 12:09
von kbr
erdal1934 hat geschrieben:Danke, Lösung von sirius braucht nur noch 2 Minuten auf meinem Rechner.
Das geht bei mir erheblich schneller :D :

Code: Alles auswählen

In [7]: %%timeit
   ...: lower = 10**1000000
   ...: upper = lower * 10 - 1
   ...: num = random.randint(lower, upper)
   ...: 
100 loops, best of 3: 2.17 ms per loop
Compiler time: 0.24 s

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 13:39
von BlackJack
@kbr: Vielleicht ist da die Zeit enthalten das Ergebnis auch auszugeben. :-)

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 14:11
von erdal1934
Nein, alter Rechner.

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 14:35
von /me
erdal1934 hat geschrieben:Nein, alter Rechner.
Und deine erste Lösung läuft dann in 5 Minuten? Irgendwas passt da nicht. Hast du die for-Schleife noch stehen lassen und nur das Schleifeninnere ersetzt?

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 14:58
von erdal1934
danke, ja

Re: Zahl mit einer Millon Stellen

Verfasst: Sonntag 13. November 2016, 18:58
von BlackJack
Mal zwei deutliche Laufzeitunterschiede:

Code: Alles auswählen

In [3]: import random

In [4]: %%timeit                                                                
   ...: num = 0 
   ...: for i in range(0, 1000*1000):
   ...:     num = num*10 + random.randint(0,9)
   ...: 
1 loop, best of 3: 58min 53s per loop

In [5]: %%timeit
   ...: lower = 10**1000000
   ...: upper = lower * 10 - 1
   ...: num = random.randint(lower, upper)
   ...: 
10 loops, best of 3: 45.1 ms per loop
Compiler time: 6.37 s
Gemessen auf einem Raspi 2.

Re: Zahl mit einer Millon Stellen

Verfasst: Montag 14. November 2016, 05:42
von gast8973
Meine Lösung. Langsamer als Lösung 2, aber schneller als Lösung 1.

Code: Alles auswählen

max = 1000000
num = int(''.join(str(random.randint(0,9)) for _ in range(0,max)))

Re: Zahl mit einer Millon Stellen

Verfasst: Dienstag 15. November 2016, 11:30
von /me
gast8973 hat geschrieben:Meine Lösung.
Na gut, wenn wir jetzt schon bei albernen Lösungen sind:

Code: Alles auswählen

int('{}{}'.format(random.choice('123456789'), ''.join(random.choice('0123456789') for _ in range(999999))))
Und 1 Million Stellen sind garantiert.

Re: Zahl mit einer Millon Stellen

Verfasst: Dienstag 15. November 2016, 13:16
von jerch
Wenn die Mindeststellenanzahl garantiert sein soll, kann man das so sicherstellen:

Code: Alles auswählen

num = 0
while len(str(num)) < 10000000:
    num += random.randint(0, 10**1000000)
Hat auch ne super Laufzeit (im besten Falle nur einen Schleifendurchlauf!) :twisted:

Re: Zahl mit einer Millon Stellen

Verfasst: Samstag 19. November 2016, 17:00
von heiner88
Falls man beide Darstellungen braucht, ist die alberne Lösung trotzdem viel schneller:

Code: Alles auswählen

str1 = '{}{}'.format(random.choice('123456789'), ''.join(random.choice('0123456789') for _ in range(999999)))
num1 = int(str1)

Code: Alles auswählen

lower = 10**1000000
upper = lower * 10 - 1
num2  = random.randint(lower, upper)
str2  = str(num2)