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


Slumpvis fylla en n*n array till p%

Postades av 2006-01-19 14:16:39 - Pedro Cunha, i forum vb.net, Tråden har 4 Kommentarer och lästs av 627 personer

Jag en n*n array som ska fyllas till p% (p i decimal form). Dessa n*n*p element ska ges värdet boolean TRUE. Problemet är elementen ska väljas slumpvis. Jag använder för tillfället följande algoritm.

Do

slumpa fram en ny position i arrayen

om denna position är FALSE så ge värdet TRUE och låt m=m+1

om m = n*n*p exit do

Loop

Problemet med denna algoritm är att den skalar (scale) som n^2 vilket jag helst vill unvika.

Så min fråga är om det finns en mer effektiv algoritm (som skalar t.ex. som n) för att lösa mitt problem.


Pedro


Svara

Sv: Slumpvis fylla en n*n array till p%

Postades av 2006-01-19 17:51:37 - Andreas Hillqvist

Du kan lösa det på följande sätt:

    Class key
        Public X As Long
        Public Y As Long

        Public Sub New(ByVal X As Long, ByVal Y As Long)
            Me.X = X
            Me.Y = Y
        End Sub
    End Class

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Const n As Long = 10
        Const p As Double = 0.5
        Dim data(n, n) As Boolean

        Dim x As Long, y As Long
        Dim keys As New ArrayList(n * n)

        For x = 0 To n
            For y = 0 To n
                keys.Add(New key(x, y))
            Next
        Next

        Dim rnd As New Random
        For x = 1 To n * n * p
            y = rnd.Next(0, keys.Count)
            Dim key As key = keys.Item(y)
            keys.RemoveAt(y)
            data(key.X, key.Y) = True
        Next
    End Sub

Nackdelen med denna variant är instansiering av key objekt, minnet de tar samt anropen till remove metoden.


Svara

Sv: Slumpvis fylla en n*n array till p%

Postades av 2006-01-19 18:17:40 - Niklas Jansson

<b>Så min fråga är om det finns en mer effektiv algoritm (som skalar t.ex. som n) för att lösa mitt problem. </b>
Exakt vad menar du med "skalar"?
Menar du att du får en komplexitet på O(n^2)?

Det är ju tämligen självklart... det kommer du aldrig ifrån.

Andreas metod är lite snabbare, och användbar om du inte vet hur stort p kommer vara, en "ren" variant tar väldigt lång tid för stora p. Å andra sidan tar ju Andreas metod också längre tid för stora p.

En annan, lite enklare, lösning hade varit att välja mellan två algoritmer beroende på p. För p<0.5 väljer du att lägga till element, för p>0.5 börjar du med en fylld och väljer att ta bort element.

Ytterligare ett alternativ hade varit att specialbehandla ett litet intervall runt 0.5, genom att där slumpa tillståndet på varje, och sen slumpa ut små korrektioner.


Svara

Sv:Slumpvis fylla en n*n array till p%

Postades av 2006-01-20 10:54:38 - Andreas Hillqvist

Ett alternativ som gör samma sak fast utan arraylist:

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Const n As Long = 10
        Const p As Double = 0.5
        Dim data(n, n) As Boolean

        Dim i As Integer, t As Integer
        Dim x As Integer, y As Integer
        Dim count As Integer = n * n
        
        Dim rnd As New Random
        For i = 1 To count * p
            t = rnd.Next(0, count)
            Do
                x = t Mod n
                y = t \ n
                t = (t + 1) Mod count
            Loop While data(x, y)
            data(x, y) = True
        Next
    End Sub


Svara

Sv: Slumpvis fylla en n*n array till p%

Postades av 2006-01-20 15:11:50 - Niklas Jansson

Jo, fast som sagt, den blir löjligt ineffektiv för p i området 0.8.
Det är bättre att ha två separata algoritmer, en för under 0.5 och en för över.


Svara

Nyligen

  • 19:55 kick-off med fokus på hälsa?
  • 19:53 kick-off med fokus på hälsa?
  • 16:24 Föreslå en skönhetsklinik online
  • 16:23 Föreslå en skönhetsklinik online
  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak

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 725
27 958
271 751
408
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