Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Program som slumpar tal

Postades av 2004-08-28 11:40:42 - Arne Bergdahl, i forum visual basic - allmänt, Tråden har 17 Kommentarer och lästs av 1061 personer

Hur kan jag enklast skriva ett program som slumpar fram 21 heltal mellan 0 och 100 till en vektor och när slumpningen är klar ska de sist slumpade talen skrivas ut. Slumpningen och utskrtft ska ske i två olika procedurer.

Novisen Arne


Svara

Sv: Program som slumpar tal

Postades av 2004-08-28 14:56:04 - Sven Åke Persson

<code>
'1 Knapp och 1 ListBox
Option Explicit
Dim rndArray(99) As Long

Private Sub Form_Load()
Randomize
End Sub

Private Sub Command1_Click()
Dim rndNum As Long
Dim i As Long
List1.Clear
Do Until i >= 21
rndNum = Int(Rnd * 99) + 1
If rndArray(rndNum) = 0 Then
rndArray(rndNum) = 1
i = i + 1
End If
Loop
For i = 1 To 99
If rndArray(i) = 1 Then
List1.AddItem i
rndArray(i) = 0
End If
Next 'i
End Sub
</code>


Svara

Sv: Program som slumpar tal

Postades av 2004-08-28 21:20:22 - Mattias Frisk

Dim talen(21) As Integer

Private Sub Command1_Click()
Dim x As Integer

List1.Clear

For x = 1 To 21
talen(x) = Int(Rnd * 100 + 1)
Next

For x = 21 To 1 Step -1
List1.AddItem talen(x)
Next

End Sub

Private Sub Form_Load()
Randomize
End Sub


Svara

Sv: Program som slumpar tal

Postades av 2004-08-28 22:13:01 - Sven Åke Persson

Frisker ! Du får kraftig bakläxa på detta. Du tillåter samma tal komma upp 2 ggr eller fler.
Du har inte med 0. Som frågeställaren besällde.
Du använder Integer i Vb som är helt onödigt, skall vara Long.
talen(x) = Int(Rnd * 100 + 1)
Kan skrivas Int(Rnd*101)

Som du skriver skulle du rent principiellt kunna få 21 st 68.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-29 00:41:39 - Oskar Johansson

Sven: Din lösning var inte precis optimal heller. Din kan rent principiellt hänga sig pga. att den slumpar ett tal, testar om det redan är slumpat, om det är det så försöker den igen. om dennu slumpar samma tal hela tiden så...?


Svara

Sv: Program som slumpar tal

Postades av 2004-08-29 09:22:57 - Anton Jinsen

>Du har inte med 0. Som frågeställaren besällde.
Han skriver ju mellan 0 och 100. Dvs från och med 1 till och med 99.
Det står dessutom inget om att talen som slumpas bara får förekomma en gång.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-29 11:00:42 - Sven Åke Persson

>testar om det redan är slumpat, om det är det så försöker den igen. om dennu slumpar samma tal hela tiden så...?

Det är omöjligt då man använder timerns 1000 delar som frö.Håller med att det i princip kan hålla på i timmar
men någon gång måste det gå att få fram 21 olika.

Du kan ju provköra mitt förslag,jag lovar om du kör 100 000 gr så kommer det aldrig att hända att den hänger sig.

Ang 0 - 100 så kan det vara som AJ påpekar frågeställaren får klargöra,samma med 2 av samma, lätt att justera.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-30 10:01:16 - Johan Forsberg

Du verkar ha något problem med datatyper?
Korta heltal tar ju mindre minne, så varför inte använda dem?
Om personen i fråga skall slumpa tal större än 65535 (2 ^16) så kanske det är nödvändigt.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-30 11:52:00 - Sven Åke Persson

>Du verkar ha något problem med datatyper?

Okunnigt "bullshit" du skriver .Eftersom 32 bitars datorer skyfflar 4 byte åt gången dvs Long
så finns det aldrig någon mening med att använda Integer i VB 6.Det betyder bara att programmet
måste göra en extra, helt onödig operation att omvandla dessa 4 byte till en Integer 2 byte.
Om du kör Integer i matematik i Vb så blir det en himmla massa onödiga omvandlingar och klockpulser

Det är oproffsigt att inte använd 32 bitars processorers hela kapacitet !

I moderna program .net mfl betyder Integer numera 4 byte dvs vårt Long. Använd Long i Vb 6 !

>Korta heltal tar ju mindre minne, så varför inte använda dem?
Därför hastighet alltid prioriteras före minne du sparar 2 byt /Integer , en fis i minnesrymden.

Vidare så deklareras dessa Long oftast i Privata Sub eller Functioner dvs dom lever så kort tid
att det är fullständigt meningslöst att bekymra sig för dessa 2 byte.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-30 16:36:30 - Jan Bulér

Angående slumpning, istället för att köra en loop och generera ett slumpvärde varje varv och kontrollera om det redan är använt så är det bättre att först skapa en array med alla nummer i ordning, varje nummer förekommer bara en gång, och sedan köra en loop genom arrayen och byta plats med den array(loopIndex) och Array(slumpIndex). slumpIndex ska naturligtvis vara inom arrayens gränser. På detta vis behövs bara två loopar genom hela arrayen för att generera en slumpad lista.
Ett ännu snabbare sätt är att använde en hjälparray och bara köra en loop ett varv genom arrayen (se mitt exempel).

<code>

Sub main()
Const MINVALUE As Integer = 0
Const MAXVALUE As Integer = 100

Dim arrInts() As Integer
Dim i As Integer

Randomize

arrInts = GetRandomArray(MINVALUE, MAXVALUE)

ReDim Preserve arrInts(20)

For i = LBound(arrInts) To UBound(arrInts)
Debug.Print "Värde " & i & ": " & arrInts(i)
Next

End Sub


Private Function GetRandomArray(Optional ByVal StartValue As Integer = 0, Optional ByVal EndValue As Integer = &H7FFF) As Integer()
Dim arrRet() As Integer
Dim arrSet() As Boolean
Dim RndNum As Integer, temp As Integer
Dim lngStart As Long, lngEnd As Long, i As Long

lngStart = StartValue: lngEnd = EndValue

If lngEnd - lngStart < 0 Then Exit Function
' ReDim arrRet(lngEnd - lngStart)
' ReDim arrSet(UBound(arrRet))
ReDim arrRet(lngEnd - lngStart)
ReDim arrSet(lngEnd - lngStart)


For i = LBound(arrRet) To UBound(arrRet)
RndNum = GetRandomNum(LBound(arrRet), UBound(arrRet))
If Not arrSet(i) Then
arrRet(i) = i + lngStart
arrSet(i) = True
End If

If Not arrSet(RndNum) Then
arrRet(RndNum) = RndNum + lngStart
arrSet(RndNum) = True
End If

temp = arrRet(i)
arrRet(i) = arrRet(RndNum)
arrRet(RndNum) = temp

Next

GetRandomArray = arrRet

End Function


Private Function GetRandomNum(ByVal MinVal As Integer, ByVal MaxVal As Integer) As Long
Dim temp As Currency
Dim result As Currency

'Temp variablen används för att ta hand om när MaxVal har maxvärde
temp = CLng(MaxVal) - CLng(MinVal) + 1

GetRandomNum = Int((temp) * Rnd + MinVal)


End Function

</code>


Svara

Sv: Program som slumpar tal

Postades av 2004-08-30 16:38:12 - Anton Jinsen

Sven, skriv ihop en programsnutt som visar att long är så mycket snabbare än integer så att vi alla kan testköra på våra datorer och bli övertygade.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 10:21:43 - Sven Åke Persson

Det säger väl sig själv om jag behöver använda två(2)klockpulser för att behandla en DataTyp
i stället för En(1) så tar det dubbelt så lång tid.Nu är det i verkligheten krångligare än så.
Det tar förmodligen 3 ggr så lång tid. Varför tror du man ändrat Integer till samma som Long i tex vb.net
Long finns inte längre i moderna språk man kallar den Integer och är (2 ^16)

Till Jan Buler
Du använder 38 programrader för att lösa samma sak som jag gör med mina 18 jag vet
inte om jag tycker att det är effektivare.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 12:10:09 - Thomas Roman

Jag vet inte hur vetenskapligt det här testet är, men det blir i alla fall en skillnad, även fast den är väldigt liten.

<code>
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Long, d As Long, i As Long, StartTime As Single

StartTime = Timer
For i = 1 To 200000000
a = 15000
b = a
Next i
MsgBox Timer - StartTime

StartTime = Timer
For i = 1 To 200000000
c = 15000
d = c
Next i
MsgBox Timer - StartTime
End Sub
</code>


Jag testade att ändra koden lite och då blev "Long-versionen" mycket segare än "Integer-versionen".

<code>
Private Sub Command1_Click()
Dim a As Integer, b As Integer, c As Long, d As Long, i As Long, StartTime As Single

StartTime = Timer
For i = 1 To 200000000
a = 250
b = a * 2
Next i
MsgBox Timer - StartTime

StartTime = Timer
For i = 1 To 200000000
c = 250
d = c * 2
Next i
MsgBox Timer - StartTime
End Sub
</code>


Thomas


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 12:10:33 - Anton Jinsen

Jag har inte sagt att du har fel Sven, men varför kan du inte visa med ett exempel hur mycket tid men tjänar i praktiken. Det vora mycket bättre än att snacka klockpulser.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 12:34:02 - Sven Åke Persson

>Det vora mycket bättre än att snacka klockpulser.
Klockpulser är tid

Skall se om jag orkar skruva ihop ett exempel.Då skall man använd API QueryPreformenceCounter.
[QueryPerformanceCounter]


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 14:01:47 - Martin Adrian

>Okunnigt "bullshit" du skriver .Eftersom 32 bitars datorer skyfflar 4 byte åt gången dvs Long
>så finns det aldrig någon mening med att använda Integer i VB 6.

Skyfflar 32 bitar mellan vaddå? Dagens CPU:er skyfflar väl betydligt fler bitar än så (128-256) både internt mellan register och externt med cache och ramminne.

Tester är det enda sättet att avgöra om en implementering äs snabbare än en annan. Förr kanske man kunde säga att 32 bitar var snabbare än 16 men med knappast med dagens CPUer.

Det som avgör är hur bra kompilatorn kan hålla instruktionsrör (piplines) fulla och undvika cache missar. Det senare kan i viss mån undvikas genom att inte använda mer minne än nödvändigt i stora arrayer men inte ens det gäller generellt.


Svara

Sv: Program som slumpar tal

Postades av 2004-08-31 16:04:39 - Sven Åke Persson

>Förr kanske man kunde säga att 32 bitar var snabbare än 16 men med knappast med dagens CPUer.

Ok det köper jag,men vidhåller att det är helt onödigt och i princip felaktigt att deklarera Integer i VB 6.


Svara

Sv: Program som slumpar tal

Postades av 2004-09-01 16:19:12 - Jan Bulér

Sven

Ok att jag använder fler programrader men hur många rader är det som kan komma att exkeveras vid körning. Om man ska slumpa ett tal för att sedan titta om det redan använts och i så fall slumpa om det igen så har du ju ingen aning om hur många gånger du måste ligga och lopa till du fått ett unikt värde.


Jag testade min lösning med att generera en slumpad array med unika tal mellan 1 och 32767 och det tog 60 ms att köra i VB6 utvecklingsmiljö på min dator. Prova att köra din lösning några gånger så får vi se vad det blir för tider. Jag kan tänka mig att programmet kan stå och stampa ganska länge då det 32767:nde talet ska skapas och det får inte vara samma som något av de tidigare skapade talen.

//
Janne


Svara

Nyligen

  • 18:37 Remove the bumper in AUDI
  • 15:35 Chicken road crash game
  • 21:41 Automotive Services UK
  • 20:44 Erfarenhet av CBD-olja mot sömnpro
  • 12:13 Sex Dolls for Sale
  • 19:42 Online Casinos for Haitian Players
  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 891
27 965
271 778
566
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies