/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Array blandes (kortspil)
Fra : Christian Kragh


Dato : 20-03-09 13:28

Hej.

Jeg vil gerne blande et spil kort som jeg har i et array.

Jeg har følgende:

dim cards
cards = "hjerter 1, hjerter 2, hjerter 3, hjerter 4, hjerter 5,
hjerter 6, hjerter 7, hjerter 8, hjerter 9, hjerter 10, hjerter
knægt, hjerter dame, hjerter konge, hjerter es, ruder 1, ruder 2,
ruder 3, ruder 4, ruder 5, ruder 6, ruder 7, ruder 8, ruder 9,
ruder 10, ruder knægt, ruder dame, ruder konge, ruder es, spar 1,
spar 2, spar 3, spar 4, spar 5, spar 6, spar 7, spar 8, spar 9,
spar 10, spar knægt, spar dame, spar konge, spar es, klør 1, klør
2, klør 3, klør 4, klør 5, klør 6, klør 7, klør 8, klør 9, klør
10, klør knægt, klør dame, klør konge, klør es, "

Nu vil jeg gerne blande kortne, og jeg har i sin tid brugt en
lykke med en rnd funktion til at tage et tilfædligt værdi og
sætter det bagerst i mit array.

Men dengang var det i Java, og nu skal jeg lave noget tilsvarende
i asp.

Er der nogle der har en løsning, da jeg har prøvet dette:

Function Shuffle(inArray)
incnt = ubound(inArray)
for i = 0 to ubound(inArray)
Randomize
choose = int(incnt * rnd() + 1)

outArray = choose & inArray(choose)
next

Shuffle = outArray

End Function

men det giver ikke det rigtige resultat.

Det jeg har brug for er en total tilfældig rækkefølge af mine
kort.

Christian

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Jørn Andersen (21-03-2009)
Kommentar
Fra : Jørn Andersen


Dato : 21-03-09 05:49

On 20 Mar 2009 12:27:38 GMT, Christian Kragh <tursoe@gmail.com> wrote:

>Jeg vil gerne blande et spil kort som jeg har i et array.
>
>Jeg har følgende:
>
>dim cards
>cards = "hjerter 1, hjerter 2, hjerter 3, hjerter 4, hjerter 5,
>hjerter 6, hjerter 7, hjerter 8, hjerter 9, hjerter 10, hjerter
>knægt, hjerter dame, hjerter konge, hjerter es, ruder 1, ruder 2,
>ruder 3, ruder 4, ruder 5, ruder 6, ruder 7, ruder 8, ruder 9,
>ruder 10, ruder knægt, ruder dame, ruder konge, ruder es, spar 1,
>spar 2, spar 3, spar 4, spar 5, spar 6, spar 7, spar 8, spar 9,
>spar 10, spar knægt, spar dame, spar konge, spar es, klør 1, klør
>2, klør 3, klør 4, klør 5, klør 6, klør 7, klør 8, klør 9, klør
>10, klør knægt, klør dame, klør konge, klør es, "

hjerter 1 og hjerter es er vist det samme i et alm. spil kort ...

>Nu vil jeg gerne blande kortne, og jeg har i sin tid brugt en
>lykke med en rnd funktion til at tage et tilfædligt værdi og
>sætter det bagerst i mit array.
>
>Men dengang var det i Java, og nu skal jeg lave noget tilsvarende
>i asp.
>
>Er der nogle der har en løsning, da jeg har prøvet dette:
>
>Function Shuffle(inArray)
> incnt = ubound(inArray)
> for i = 0 to ubound(inArray)
> Randomize
> choose = int(incnt * rnd() + 1)
>
> outArray = choose & inArray(choose)
> next
>
> Shuffle = outArray
>
>End Function
>
>men det giver ikke det rigtige resultat.

Hvordan konstaterer du, at det ikke giver det rigtige resultat?

VBScript-dokumentation siger:
To produce random integers in a given range, use this formula:
Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

I dit tilfælde (et array, som går fra 0 til 51):
Int((51 - 0 + 1) * Rnd + 0)
= Int(52 * Rnd)

Og så viser eksemplet i dok., at Randomize skal være uden for loopen.

>Det jeg har brug for er en total tilfældig rækkefølge af mine
>kort.

Håber det hjælper - har ikke testet.

Good luck!

--
Jørn Andersen,
Brønshøj

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 06:23

Jørn Andersen wrote:

> I dit tilfælde (et array, som går fra 0 til 51):
> Int((51 - 0 + 1) * Rnd + 0)
> = Int(52 * Rnd)

Man skal vel også teste på om et givet kort er udtaget på forhånd ?
Selv om det er 'random', tror jeg ikke der er garanti for der ikke er
dubletter i de første 52 Rnd værdier.

--
Med venlig hilsen
Stig Johansen

Jørn Andersen (21-03-2009)
Kommentar
Fra : Jørn Andersen


Dato : 21-03-09 07:06

On Sat, 21 Mar 2009 06:23:05 +0100, Stig Johansen <wopr.dk@gmaill.com>
wrote:

>Jørn Andersen wrote:
>
>> I dit tilfælde (et array, som går fra 0 til 51):
>> Int((51 - 0 + 1) * Rnd + 0)
>> = Int(52 * Rnd)
>
>Man skal vel også teste på om et givet kort er udtaget på forhånd ?
>Selv om det er 'random', tror jeg ikke der er garanti for der ikke er
>dubletter i de første 52 Rnd værdier.

Man skal i hvert fald gøre et eller andet. Jeg kunne ikke lige
gennemskue, hvad han ville med sit outArray, men jeg tror du har ret.
Der er en endog *meget, meget* lille sandsynlighed for, at der ikke er
dubletter i de første 52 Rnd-værdier.


Mvh. Jørn

--
Jørn Andersen,
Brønshøj

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 08:53

"Jørn Andersen" <jorn@jorna.dk> wrote in message
news:bn09s49u2md5rciqsbevm2st1ff6d73k8g@4ax.com...
> On Sat, 21 Mar 2009 06:23:05 +0100, Stig Johansen <wopr.dk@gmaill.com>
> wrote:
>
> >Jørn Andersen wrote:
> >
> >> I dit tilfælde (et array, som går fra 0 til 51):
> >> Int((51 - 0 + 1) * Rnd + 0)
> >> = Int(52 * Rnd)
> >
> >Man skal vel også teste på om et givet kort er udtaget på forhånd ?
> >Selv om det er 'random', tror jeg ikke der er garanti for der ikke er
> >dubletter i de første 52 Rnd værdier.
>
> Man skal i hvert fald gøre et eller andet. Jeg kunne ikke lige
> gennemskue, hvad han ville med sit outArray, men jeg tror du har ret.

Jeg vil gætte på, at han vil have et færdigblandet deck.

> Der er en endog *meget, meget* lille sandsynlighed for, at der ikke er
> dubletter i de første 52 Rnd-værdier.

Det er meget værre, det ser ud som Rnd funktionen simpelthen ikke dúr.

Jeg lavede en lille 'blanderutine', der _burde_ udtage et færdigblandet deck
som talværdier i en streng.
Tanken var, at man kunne generere disse værdier, og derefter splitte dom op
i et array.

Men allerede ved halvdelen kommer der mange dubletter, og den ender med at
'brække' sig (aka stack overflow) ved en 44-46 stykker.

Man skal nok finde en anden 'blandemetode'.

Kode:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da">

<head>
<title>Card shuffle</title>
</head>

<body>
<h3>Card shuffle</h3>
<%
Dim Deck
Deck = ""
Randomize
Response.write Shuffledeck (Deck,52,0,Int(52 * Rnd) + 1)

Function Shuffledeck ( CurrentDeck, NumberOfCards, Cards , ThisCard )
if Cards >= NumberOfCards then exit Function
' ThisCard = Int(NumberOfCards * Rnd) + 1
Response.Write Currentdeck + " - " + cStr(Numberofcards) + " - " +
cStr(Cards) + " - " + cStr(Thiscard) + "<br/>"
if instr(CurrentDeck,cStr(ThisCard)+"," ) > 0 then
Shuffledeck = Shuffledeck ( CurrentDeck, NumberOfCards, Cards , Int(52 *
Rnd) + 1)
else
Shuffledeck = Shuffledeck ( CurrentDeck + cStr(Thiscard) + "," ,
NumberOfCards, Cards + 1 ,Int(52 * Rnd) + 1)
end if
End Function
%>

(Hold øje med linieskift)

--
Med venlig hilsen/Best regards
Stig Johansen




Leif Neland (21-03-2009)
Kommentar
Fra : Leif Neland


Dato : 21-03-09 09:27

Stig Johansen skrev:
> "Jørn Andersen" <jorn@jorna.dk> wrote in message
> news:bn09s49u2md5rciqsbevm2st1ff6d73k8g@4ax.com...
>> On Sat, 21 Mar 2009 06:23:05 +0100, Stig Johansen <wopr.dk@gmaill.com>
>> wrote:
>>
>>> Jørn Andersen wrote:
>>>
>>>> I dit tilfælde (et array, som går fra 0 til 51):
>>>> Int((51 - 0 + 1) * Rnd + 0)
>>>> = Int(52 * Rnd)
>>> Man skal vel også teste på om et givet kort er udtaget på forhånd ?
>>> Selv om det er 'random', tror jeg ikke der er garanti for der ikke er
>>> dubletter i de første 52 Rnd værdier.
>> Man skal i hvert fald gøre et eller andet. Jeg kunne ikke lige
>> gennemskue, hvad han ville med sit outArray, men jeg tror du har ret.
>
> Jeg vil gætte på, at han vil have et færdigblandet deck.
>
>> Der er en endog *meget, meget* lille sandsynlighed for, at der ikke er
>> dubletter i de første 52 Rnd-værdier.
>
> Det er meget værre, det ser ud som Rnd funktionen simpelthen ikke dúr.
>
> Jeg lavede en lille 'blanderutine', der _burde_ udtage et færdigblandet deck
> som talværdier i en streng.
> Tanken var, at man kunne generere disse værdier, og derefter splitte dom op
> i et array.
>
> Men allerede ved halvdelen kommer der mange dubletter, og den ender med at
> 'brække' sig (aka stack overflow) ved en 44-46 stykker.
>

Pseudokode:

dim deck=array[0..51]
for n=0 to 51
deck[n]=n+1
next

for n=51 to 1 step -1
m=intrandom(n) // 'tilfældigt heltal mellem 0 og n inklusive.
swap(deck[n],deck[m])
next

Algoritmen svarer (næsten) til at man 51 gange trækker et tilfældigt
kort ud af en bunke og lægger det over i den anden.

Leif

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 12:01

"Leif Neland" <leif@neland.dk> wrote in message
news:49c4a53b$0$56772$edfadb0f@dtext02.news.tele.dk...
> Pseudokode:

[snip]
Det var squ da ikke så ringe endda ;)

Her er lidt 'real code':
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="da">

<head>
<title>Card shuffle</title>
<style type="text/css">
th , td {border: 1px solid blue ; }
</style>

</head>

<body>
<h3>Card shuffle</h3>
<%
Dim Deck(51)
Dim Counter
Randomize
For Counter = 0 to 51
Deck(Counter) = Counter + 1
Next

Shuffledeck Deck

%><table><tr><th>Cardnumber</th><th>Card</th></tr><%
For Counter = 0 to uBound(Deck)
Response.Write "<tr><td>" + cStr(Counter+1) + "</td><td>" +
cStr(Deck(Counter)) + "</td></tr>"
Next
%></table><%
Sub Shuffledeck ( CurrentDeck )
Dim FromCard,ToCard,Intermidiate

For ToCard = 51 to 1 Step - 1
FromCard = Int(52 * Rnd)
Intermidiate = CurrentDeck(FromCard)
CurrentDeck(FromCard) = CurrentDeck(ToCard)
CurrentDeck(ToCard) = Intermidiate
Next

End Sub
%>

> Algoritmen svarer (næsten) til at man 51 gange trækker et tilfældigt
> kort ud af en bunke og lægger det over i den anden.

Ja 'næsten' - om entropien er god nok, kan man nok diskutere, men
ovenstående kode 'går dog ikke ned'.

Men 'true random' findes vist ikke.

--
Med venlig hilsen/Best regards
Stig Johansen




Christian Kragh (21-03-2009)
Kommentar
Fra : Christian Kragh


Dato : 21-03-09 13:06

> Det var squ da ikke så ringe endda ;)

Planen var at have et array, som jeg trækker en tilfældig værdi ud fra og
lægger det i det array jeg skal bruge, så denne løsning ser ud til at
virke...

Men findes der en metode til at tage en værdi i et array, lægge det
bagerst og slette den oprindelige plads?

Noget i retning af

qArray = "0,1,2,3,4,5,"
qArray = split(qArray,",")

qArray(uBound(qArray)) = qArray(0)
qArray(0) Slettes

MVH

Christian

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 15:21

Christian Kragh wrote:

>> Det var squ da ikke så ringe endda ;)
>
> Planen var at have et array, som jeg trækker en tilfældig værdi ud fra og
> lægger det i det array jeg skal bruge, så denne løsning ser ud til at
> virke...
>
> Men findes der en metode til at tage en værdi i et array, lægge det
> bagerst og slette den oprindelige plads?

Man kan sikkert lave noget med en collection af kortene, men det er ikke
sikkert det bliver mere tilfældigt.

Den angivne funktion svarer lidt til at blande en stak kort, og hvis du skal
bruge 7 kort, så er det bare at blande og udtage de 7 første kort.

Hvad er det, mere præcist, du skal bruge?

--
Med venlig hilsen
Stig Johansen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 15:29

Stig Johansen skrev:

> Hvad er det, mere præcist, du skal bruge?

Hvad med
http://www.google.dk/search?hl=da&q=shuffle+cards+function+asp&btnG=Google-s%C3%B8gning&meta=&aq=f&oq=

f.eks.
http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=114

?


MVH
Rune Jensen

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 16:13

Rune Jensen wrote:

> Stig Johansen skrev:
>
>> Hvad er det, mere præcist, du skal bruge?
>
> Hvad med
>
http://www.google.dk/search?hl=da&q=shuffle+cards+function+asp&btnG=Google-s%C3%B8gning&meta=&aq=f&oq=
>
> f.eks.
> http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=114

Det var nu mere hvad Christian skal bruge - funktionelt.
Funktionen fra før svarer til:
- Tag et spil kort i rækkefølge
- Bland kortene

Nu har han en færdigblandet bunke, han kan tage et antal kort fra.

Om man blander bunken i tilfældig orden, og udtager de 5 første, eller
udtager 5 tilfældige kort fra en sorteret bunke, kan jeg ikke se den store
forskel på.

Den fundamentale problemstilling, som også angivet i dit link må være:
"truly random manner"

Collections, som jeg nævnte, kan løse dette problem fra dit link:
"The only hard part is replicating the physical removal of the card from the
deck, so that the deck gets smaller and smaller."

Men som sagt ved jeg ikke om det bliver mere "truly random" med den metode.

--
Med venlig hilsen
Stig Johansen

Christian Kragh (21-03-2009)
Kommentar
Fra : Christian Kragh


Dato : 21-03-09 16:15

> > Hvad er det, mere præcist, du skal bruge?
> f.eks.
> http://www.aspfaqs.com/aspfaqs/ShowFAQ.asp?FAQID=114

Jeg må indrømme at jeg havde kigget på denne side før jeg skrev mit indlæg, men nu da jeg har fået det
prøvet lidt bedre efter, og fået det tilpasset virker det som det skal.

Se www3.ckweb.dk/webtest/shuffel.asp

Det som man sikkert kan se nederst, hvis man kender spillet, er de brikker / spilleplader der bruges til
The Settlers of Catan.

Så må i jo godt gætte hvad jeg er igang med at lave...

Men mange tak for hjælpen, det var super.

Christian

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Stig Johansen (21-03-2009)
Kommentar
Fra : Stig Johansen


Dato : 21-03-09 16:29

Christian Kragh wrote:

> Jeg må indrømme at jeg havde kigget på denne side før jeg skrev mit
> indlæg, men nu da jeg har fået det prøvet lidt bedre efter, og fået det
> tilpasset virker det som det skal.
>
> Se www3.ckweb.dk/webtest/shuffel.asp
Skulle måske være
<http://www3.ckweb.dk/webtest/shuffle.asp>

Nu kender jeg ikke spillet, men selvom du skriver:
"The cards were originally numbered from 1 to 20"
så får jeg tal ud der er større end 20
.... HOV
tjekkede lige igen - du retter vist løbende :)

--
Med venlig hilsen
Stig Johansen

Christian Kragh (22-03-2009)
Kommentar
Fra : Christian Kragh


Dato : 22-03-09 11:42

> > Se www3.ckweb.dk/webtest/shuffel.asp
> Skulle måske være
> <http://www3.ckweb.dk/webtest/shuffle.asp>

Du har helt ret...

> Nu kender jeg ikke spillet, men selvom du skriver:
> "The cards were originally numbered from 1 to 20"
> så får jeg tal ud der er større end 20
> .... HOV
> tjekkede lige igen - du retter vist løbende :)

Jeg har det første fra 1 til 20 nu.
Den anden er de spilleplader der findes i spillet.
Den tredje er de tal der skal være på felterne, foruden ørkenen...
Det sidste er terningerne der bliver slået i hver runde.

Tak igen.

Christian

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 14:36

Stig Johansen skrev:

> Men 'true random' findes vist ikke.

....et lille forsøg viser en ret stor forskel på cint og int. Ved cint på
6 forskellige tilfældige tal, altså cint(rnd *5+1), er 1 og 6 en del
mindre repræsenteret end andre gennem flere kørsler.

Med int ser det nogenlunde ligeligt fordelt ud ved flere kørsler.

Hver kørsel bestående af 250 udtræk.


MVH
Rune Jensen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 16:10

Jørn Andersen skrev:
> On 20 Mar 2009 12:27:38 GMT, Christian Kragh <tursoe@gmail.com> wrote:
>
>> Jeg vil gerne blande et spil kort som jeg har i et array.
>>
>> Jeg har følgende:
>>
>> dim cards
>> cards = "hjerter 1, hjerter 2, hjerter 3, hjerter 4, hjerter 5,
>> hjerter 6, hjerter 7, hjerter 8, hjerter 9, hjerter 10, hjerter
>> knægt, hjerter dame, hjerter konge, hjerter es, ruder 1, ruder 2,
>> ruder 3, ruder 4, ruder 5, ruder 6, ruder 7, ruder 8, ruder 9,
>> ruder 10, ruder knægt, ruder dame, ruder konge, ruder es, spar 1,
>> spar 2, spar 3, spar 4, spar 5, spar 6, spar 7, spar 8, spar 9,
>> spar 10, spar knægt, spar dame, spar konge, spar es, klør 1, klør
>> 2, klør 3, klør 4, klør 5, klør 6, klør 7, klør 8, klør 9, klør
>> 10, klør knægt, klør dame, klør konge, klør es, "
>
> hjerter 1 og hjerter es er vist det samme i et alm. spil kort ...

Der er også en anden ting. der er ingen grund til at beskrive hvert
enkelt kort, da visse ting går igen. Gør man det systematisk, kan man
lave en måske lidt mere fleksibel function.. f.eks.

Alle kort 2-10 er jo det samme, kun kuløren er anderledes. Bruges
mod-funktionen, kan man angive, at f.eks. alle tal imellem 1 og 13 er
hjerter, mellem 2 og 36 er ruder osv.

Det burde kunne laves så nogenlunde med (psudokode)

for i = 1 to 52
   select case int( i/13)
      case 0
         card (i) ="hjerter"
      case 1
         card (i) ="ruder"
      case 2
         card (i) ="klør"
      case else
         card (i) ="spar"
   end case

   select case i mod 13
      case 1
         card(i) = card(i) + " es"
      case 11
         card(i) = card(i) + " knægt"
      case 12
         card(i) = card(i) + " dame"
      case 13
         card(i) = card(i) + " konge"
      case else
         card(i) = card(i) & i mod 13
   end select
next

...nu er det jo defineret på forhånd, så det er måske ikke optimalt, da
der er en del + med strenge. Men maskinen behøver ikke vide, hvad
kortene hedder, for at lave beregninger med dem. Derfor kan man i stedet
bare lave en function, som finder ud af, hvad kortet hedder udfra et tal
- man behøver ikke beskrive det inden, men kan bruge funktionen kun når
kortet skal vises for brugeren.

Altså

function cardDescription( cardNumber)
   select case int( cardNumber/13)
      case 0
         cardDescription ="Hjerter"
      case 1
         cardDescription ="Ruder"
      case 2
         cardDescription ="Klør"
      case else
         cardDescription ="Spar"
   end case

   select case i mod 13
      case 1
         cardDescription = cardDescription + " Es"
      case 11
         cardDescription = cardDescription + " Knægt"
      case 12
         cardDescription = cardDescription + " Dame"
      case 13
         cardDescription = cardDescription + " Konge"
      case else
         cardDescription = cardDescription & cardNumber mod 13
   end select
end function

...så er der selvfølgelig lige det med 0 og 1, hvor man begynder i
arrayet. Det skal man lige bestemme sig for først når man vil bruge mod.

Man bør kunne undvære et array på den måde..?


MVH
Rune Jensen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 16:17

Rune Jensen skrev:

> function cardDescription( cardNumber)
> select case int( cardNumber/13)
> case 0
> cardDescription ="Hjerter"
> case 1
> cardDescription ="Ruder"
> case 2
> cardDescription ="Klør"
> case else
> cardDescription ="Spar"
> end case

Denne bør yderligere kunne optimeres med

cardDescription = split( "Hjerter Ruder Klør Spar") (int( i/13))


MVH
Rune Jensen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 16:39

Rune Jensen skrev:
> Rune Jensen skrev:
>
>> function cardDescription( cardNumber)
>> select case int( cardNumber/13)
>> case 0
>> cardDescription ="Hjerter"
>> case 1
>> cardDescription ="Ruder"
>> case 2
>> cardDescription ="Klør"
>> case else
>> cardDescription ="Spar"
>> end case
>
> Denne bør yderligere kunne optimeres med
>
> cardDescription = split( "Hjerter Ruder Klør Spar") (int( i/13))

...og yderligere med:
function cardDescription( cardNumber)

   cardDescription = split( "Hjerter Ruder Klør Spar") (int(
cardNumber/13)) & " " & split( "Es 2 3 4 5 6 7 8 9 10 Knægt Dame
Konge") (cardNumber mod 13)

end function


så er begge funktioner med i én linje (3 ialt dog) uden brug af arrays.


MVH
Rune Jensen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 10:41

Christian Kragh skrev:

> Det jeg har brug for er en total tilfældig rækkefølge af mine
> kort.

Lidt kommentarer, så er det så vidt jeg ved meget svært med en maskine
at lave 100% tilfældige tal - men man kan lave en acceptabel simulation.
Man er tvunget til først og fremmest at finde noget, som ændrer sig
konstant og hurtigt. Her bruges den indbyggede timer som "seed" - det er
det, randomize gør. Altså tilfældigt tal baseret på tiden lige nu.

Derefter skal næste tal jo ikke ligne det forrige eller danne en
systematisk gennemskuelig række af tal ved gentagne udtræk, for det er
netop ikke tilfældigt - så man baserer næste tal på forrige. Hvordan det
så lige foregår er jeg ikke helt klar over. Men bruger man randomize
hver gang (i selve loopet), så vil man, fordi scriptet udføres så
hurtigt, formentlig få mange ens tal efter hinanden. ...det kunne
formentlig virke alligevel, hvis man talte f.eks. milliontedel skunder,
men jeg tror ikke timeren er specielt nøjagtig.

Miscrosoft er ikke selv særlig klar i mælet; så vidt jeg kan se i deres
infoboks, foreslår de en minus som seed (altså et -rnd?), hvis man skal
have gentagne random numbers. I gamle dage havde rnd en attribut,
rnd(attribut), som var selve seedet. Dvs. man kunne selv bestemme sin
seed. Det findes ikke i VBscript - åbenbart.

Her er artiklen på MSDN på Randomize og Rnd:
http://msdn.microsoft.com/en-us/library/38d7ckek(VS.85).aspx
og
http://msdn.microsoft.com/en-us/library/e566zd96(VS.85).aspx


MVH
Rune Jensen

Rune Jensen (21-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 21-03-09 10:45

Rune Jensen skrev:

> Miscrosoft er ikke selv særlig klar i mælet; så vidt jeg kan se i deres
> infoboks, foreslår de en minus som seed (altså et -rnd?), hvis man skal
> have gentagne random numbers. I gamle dage havde rnd en attribut,
> rnd(attribut), som var selve seedet. Dvs. man kunne selv bestemme sin
> seed. Det findes ikke i VBscript - åbenbart.

Ah, faktisk er formlen
Randomize [number]

...så det må være nummber, som skal være negativ ved gentagne udtræk?


MVH
Rune Jensen

Leif Neland (21-03-2009)
Kommentar
Fra : Leif Neland


Dato : 21-03-09 18:04

Rune Jensen skrev:
> Rune Jensen skrev:

> Randomize [number]
>
> ..så det må være nummber, som skal være negativ ved gentagne udtræk?
>
Man plejer kun at skulle randomize een gang.
Hvis random-generatoren så er ordentlig lavet, så giver den en jævn
fordeling af tallene.

Hvis man kører f.ex. randomize(123), så får man den samme tilfældige
sekvens hver gang; anvendeligt til test, eller hvis man vil prøve kabale
nr 123 igen.

randomize -1 giver en tilfældig sekvens, seeded af f.ex uret,
cpu-temperatur og varigheden af sidste 28 tastetryk, eller andre
forhåbentlig uforudse-bare værdier.

Leif

Rune Jensen (23-03-2009)
Kommentar
Fra : Rune Jensen


Dato : 23-03-09 16:52

Leif Neland skrev:

> Man plejer kun at skulle randomize een gang.
> Hvis random-generatoren så er ordentlig lavet, så giver den en jævn
> fordeling af tallene.

Det tror jeg den er. Jeg lavede et forsøg med kast med en terning, 1500
udtræk, randomize én gang udenfor loop, og det er meget jævnt fordelt.
Også ved flere kørsler.


> Hvis man kører f.ex. randomize(123), så får man den samme tilfældige
> sekvens hver gang; anvendeligt til test, eller hvis man vil prøve kabale
> nr 123 igen.
>
> randomize -1 giver en tilfældig sekvens, seeded af f.ex uret,
> cpu-temperatur og varigheden af sidste 28 tastetryk, eller andre
> forhåbentlig uforudse-bare værdier.

OK, så blev jeg også klogere. For MS skriver ikke noget om dette, kun at
muligheden for at angive en værdi er der, ikke hvad den bruges til.

Man kan angive en værdi i både randomize og rnd iflg. MS. Men som du
skriver, er det ikke nødvendigt i andet end specielle tilfælde, og jeg
har heller ikke analyseret nærmere på det, da fordelingen som beskrevet
ovenfor er jævn, uden dog direkte synlig systematik i tallene.


MVH
Rune Jensen

Søg
Reklame
Statistik
Spørgsmål : 177425
Tips : 31962
Nyheder : 719565
Indlæg : 6407918
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste