|
| 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 (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
| |
|
|