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


Slumpa med tyngd

Postades av 2010-04-30 08:24:28 - Jonas Sjöblom, i forum systemutveckling generellt, Tråden har 11 Kommentarer och lästs av 2544 personer

Är kanske bara morgontrött men kommer inte på någon smart lösning på det här.

Jag har en lista/array med objekt, varje objekt har ev viss tyngd som ska öka chansen att just det objektet väljs från listan. Detta tyngd-värde kan som minst vara 100 (eller 1 om man föredrar det) men har ingen övre gräns.

Frågan är nu hur jag gör för att slumpa fram ett av objekten men ge proportionellt större chans åt de med större tyngd.

Jag är inte ute efter någon perfekt fungerande kod utan undrar bara hur jag ska gå till väga.


Svara

Sv: Slumpa med tyngd

Postades av 2010-04-30 08:53:26 - Eric Johansson

1. Sortera listan på tyngden

2.a och ta det översta elementet =)

2.b eller slumpa på översta hälften för att 50% ska ha en större chans.

Om jag nu har förstått ditt problem ordentligt såhär tidigt på morgonen XD


Svara

Sv: Slumpa med tyngd

Postades av 2010-04-30 09:25:42 - Dan Therkildsen

Borde man inte kunna göra så här:

1. Loopa igenom arrayen och lägg till id't X antal gånger i en slump-array, där X är vikten

2. Slumpa fram ett id från slump-arrayen


Svara

Sv: Slumpa med tyngd

Postades av 2010-04-30 10:32:48 - Henrik Malmberg

1. Lägg ihop alla vikter till en total
2. Slumpa fram ett nummer mindre än "total"
3. Gå igenom arrayen i ordning högsta vikt till minsta vikt, dra ifrån vikten från random-värdet, när random värdet är negativt, returnera den ordningen i listan/arrayen


Lite Javascript som illustrerar det hela, namnen är heeeeelt och hållet påhittade och har ingen koppling till personer på forumet;


function chooseWeighted(arr) {
    var num = arr.length, total = 0;
    for (var i=0; i<num; i++) {
        total += arr[i][1];
    }

    i = -1;
    var random = Math.floor(Math.random()*total);
    while (random > 0) {
        random -= arr[++i][1];
    }

    return arr[i];
}


var weights = [['Malm Henrikberg', 10], ['Sjö Jonasblom', 7], ['Johan Ericsson', 5], ['Therkild Dansen', 5], ['Johan Persson', 2], ['Per-Åke Svensson', 0]];

var thechoosen = chooseWeighted(weights);
alert(thechoosen[0]);


Svara

Sv: Slumpa med tyngd

Postades av 2010-04-30 10:53:29 - Jonas Gunnarsson

* Skapa en tmp.lista.
* från org.listan infoga antal element till tmp.listan baserat på tyngden.
* slumpa från tmp.listan.


Svara

Sv:Slumpa med tyngd

Postades av 2010-04-30 18:51:03 - Niklas Jansson

Henriks variant är rätt. Dan, Jonas: Vad gör ni om man får vikten 2.37?

Det enklaste, tankemässigt är nog: lägg ihop alla vikter till en total. Dividera varje vikt med denna total. Då får man alla som var sin andel (tar man gånger 100 får man procentsats).

Lägg sen alla efter varandra och slumpa fram en plats mellan 0 och 1, den som ligger där blir vald. (Och det gör man med Henriks kod)


Svara

Sv: Slumpa med tyngd

Postades av 2010-05-01 16:28:52 - Jonas Sjöblom

Tack Henrik, tror din lösning är den bästa ifall att jag behöver använda mig av decimaler i vikterna. En sak förstår jag dock inte; Varför ska man sortera arrayen med högst först? Blir inte resultatet det samma oberoende av ordning på elementen i arrayen?


Svara

Sv:Slumpa med tyngd

Postades av 2010-05-02 21:40:20 - Niklas Jansson

Behövs inte, men bör göra urvalet lite snabbare.
Kommer du hämta många gånger från samma lista?


Svara

Sv: Slumpa med tyngd

Postades av 2010-05-04 12:05:15 - Jonas Sjöblom

Ok då är det inga problem:) Ja det har jag tänkt så tänkte att jag slumpar listans ordning innan jag kör den så inte alltid samma item ligger sist.

Men vid närmare eftertanke borde det ju inte spela någon roll om samma alltid blir sist, det har ändå samma chans att bli valt.


Svara

Sv:Slumpa med tyngd

Postades av 2010-05-21 13:10:41 - Niklas Jansson

Jo, men om man sätter de som har störst chans först så försvinner så mycket som möjligt av värdet också först.

Tänk att du har 11 stycken, 10 med 1% och en med 90%. Tänk då att du sorterar dem stigande.
Allt mellan 10% och 100% innebär då att du måste gå igenom hela listan (och kommer fram till den stora).

Vänder du på sorteringen så kommer du fram till den stora på 0-90%, och behöver bara gå igenom en enda.



Sen kommer ju förstås tiden till sorteringen in, och därför är det relevant om du använder samma lista många gånger. Annars är det waste att sortera den först.

Och slutligen är det väl extremt osannolikt att detta är så prestandakrävande att det spelar någon som helst roll... =)


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

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 569 615
27 953
271 709
5 688
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