Avatar billede glenn007 Nybegynder
26. maj 2009 - 12:23 Der er 12 kommentarer

kombinationer ?

har to lod( lad os sige r2 og b10 )

hvordan vælger man yderligere 3 random numre fra en liste
derefter skriv resultat i tesktfil hvis resultat ikke eksistere i array.

er dette mon muligt på en overskulelig måde
Avatar billede Syska Mester
26. maj 2009 - 12:48 #1
Random r = new Random();

int i = r.Next(min, max);

Sådan kan du i hvert fald få fat i et random tal ...

Jeg kan dog ikke helt gennemskue hvad du vil opnå her ...

Men noget ala:
int index = r.Next(0, array.Count);

array[index]; // så har du et tilfældigt index i dit array.

Men hvordan ved du om det ikke findes ... så mangler der vist lidt oplysninger ...

// ouT
Avatar billede glenn007 Nybegynder
26. maj 2009 - 13:21 #2
ok jeg var vist lidt nærig med info , det kan jeg godt se nu jeg læser det igennem igen.

anyway.

har en liste som ser således ud hvor de lod der er ledige findes. og derfra skal jeg vælge 3 random ind i en variabel.

// min lodliste :
ledigelod = new string[] { "1s","2s","5s","5r","9s","3s","10s","11s"};
// finde en random
// slet nyligt fundne fra liste og find næste random

// til sidst. saml alle lod i en tekststreng
string randomlodkombi = ""+R1+","+R2+","+R3+"";

et lod skal kun kunne findes random EN gang da , så det må være noget med at fjerne dem fra listen hvis den er udvalgt så næste random udvælgelse ikke for fat i den samme igen.
Avatar billede windcape Praktikant
26. maj 2009 - 18:37 #3
Du har jo i princippet løst dit eget problem nu?
Avatar billede windcape Praktikant
26. maj 2009 - 18:43 #4
Anyway, eksempel:

-----

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            var fleeces = new List<string>() {
                "1s", "2s", "5s", "5r", "9s", "3s", "10s", "11s"
            };
           
            var generator = new Random();
            var randoms  = new List<string>();
           
            for(int i=0;i<3;i++)
            {
                randoms.Add(fleeces.DequeueRandom(generator));
            }
           
            var output = randoms.Implode(",");
           
            Console.WriteLine(output);
           
            Console.Read();
        }
    }
   
    public static class LinqExtensions
    {
        public static T DequeueRandom<T>(this List<T> source, Random generator)
        {
            int next = generator.Next(0, source.Count());
            T value  = source[next];
           
            source.RemoveAt(next);   
                 
            return value;
        }

        public static string Implode<T>(
            this IEnumerable<T> source, string seperator)
        {
            StringBuilder builder = new StringBuilder();
           
            foreach(var item in source)
            {
                builder.Append(item + seperator);               
            }
           
            string result = builder.ToString();     
           
            return result.Substring(0, result.Length - seperator.Length);
        }
    }
}
Avatar billede windcape Praktikant
26. maj 2009 - 18:44 #5
Og istedet for en custom implode implementation, så kan Mono.Rocks anbefales.

http://www.mono-project.com/Rocks
Avatar billede glenn007 Nybegynder
26. maj 2009 - 18:49 #6
hehe du er gu hardcore.  den der må jeg lige tygge på. det ser mægtigt ud men skal lige forstå den helt
Avatar billede windcape Praktikant
26. maj 2009 - 18:52 #7
Det er bare en måde at skrive kode på. Ved at benytte extension metoder til formålet producerer jeg kode jeg nemt kan genbruge, og ser pænere ud end statiske metode kald.
Avatar billede windcape Praktikant
26. maj 2009 - 18:54 #8
Med statiske, men stadigvæk generiske metoder:

---

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            var fleeces = new List<string>() {
                "1s", "2s", "5s", "5r", "9s", "3s", "10s", "11s"
            };
           
            var generator = new Random();
            var randoms  = new List<string>();
           
            for(int i=0;i<3;i++)
            {
                randoms.Add(DequeueRandom(fleeces, generator));
            }
           
            var output = Implode(randoms, ",");
           
            Console.WriteLine(output);
           
            Console.Read();
        }

        public static T DequeueRandom<T>(List<T> source, Random generator)
        {
            int next = generator.Next(0, source.Count());
            T value  = source[next];
           
            source.RemoveAt(next);   
                 
            return value;
        }

        public static string Implode<T>(
            IEnumerable<T> source, string seperator)
        {
            StringBuilder builder = new StringBuilder();
           
            foreach(var item in source)
            {
                builder.Append(item + seperator);               
            }
           
            string result = builder.ToString();     
           
            return result.Substring(0, result.Length - seperator.Length);
        }
    }
}
Avatar billede glenn007 Nybegynder
26. maj 2009 - 19:43 #9
det ser perfekt ud. har dog et lille spørgsmål, hvordan kan jeg hente de enkelte resultater ud

den retunere det som en string og det er fint men hvis jeg vil have dem in i 3 variabler v1 v2 og v3 hvordan kan man mest effektivt gøre dette. nu kender jeg ikke implode så tænkte jeg hellere ville spørge inden jeg kaster mig ud i en string split.
Avatar billede glenn007 Nybegynder
26. maj 2009 - 20:10 #10
har fundet ud af det.  jeg fik brugt nogle forkerte syntax.  smidder du et svar... velfortjente point må jeg sige
Avatar billede arne_v Ekspert
26. maj 2009 - 20:56 #11
Hvis listen er tilpas kort til at performance er en non issue kan det laves som en one liner:

using System;
using System.Collections.Generic;
using System.Linq;

namespace E
{
    public class Program
    {
        private static readonly Random rng = new Random();
        public static void Main(string[] args)
        {
            IList<string> fleeces = new List<string>() { "1s", "2s", "5s", "5r", "9s", "3s", "10s", "11s" };
            string output = fleeces.OrderBy((s) => rng.Next()).Take(3).Aggregate((s1,s2) => s1 + "," + s2);
            Console.WriteLine(output);
            Console.ReadKey();
        }
    }
}
Avatar billede windcape Praktikant
27. maj 2009 - 00:20 #12
Jaa, havde glemt alt om .Take()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester