[ASP] Tekststring random door elkaar gooien

Pagina: 1
Acties:

  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
Beetje vage titel, maar ik ga het uitproberen om het helder te maken wat ik zoek.

Ik heb een tekststring die er zo uitziet:
code:
1
1, 2, 3, 4, 5, 6, etc.

Nu is het de bedoeling dat deze string wordt gesplitst op de , en dan in willekeurige volgorde wordt terug geplaatst. Dat je dit overhoud:
code:
1
5, 2, 4, 3, 1, 6, etc

En maakt niet uit wat er voor tekst staat, de ene keer een paar en de volgende keer een paar tientallen dingen. Maar het moet gewoon random door elkaar.

Ik heb al zitten werken met split enzo. Maar ik weet niet hoe ik hem random weer in elkaar kan zetten. Weet hier iemand wat op?

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Waarom überhaupt splitten? Het kan prima vanuit een array string.

Pseudocode:
ASP.NET Visual Basic:
1
2
3
4
5
6
resstring = ""
while len(jouwstring) > 0
  randnr = random(0, len(jouwstring))
  resstring = resstring & Mid(jouwstring, randnr, 1)
  jouwstring = Left(jouwstring, randnr - 1) & Right(jouwstring, randnr + 1, randnr + 1 - len(jouwstring))
wend

Zoiets zou een idee zijn.

Niet getest, dus je zal sowieso heel wat dingen aan moeten passen, maar het idee is wel duidelijk lijkt me.

[ Voor 21% gewijzigd door NMe op 07-06-2004 22:57 . Reden: foutje 8)7 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
Opzich is het een leuk idee. Maar ik zit juist met het probleem dat het niet telkens 1 karakter is.

Het kan net zo goed deze string zijn:
code:
1
1,435,42,56,2356,234

Dus ik denk dat je er eerst een array van moet maken door te splitten op , en dan op de een of andere manier te onthouden welke array nummer (of hoe je het ook noemt) je al hebt gebruikt zodat deze niet gebruik wordt.

Dat is juist het probleem en los je dus niet op met jouw code.

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • nescafe
  • Registratie: Januari 2001
  • Nu online
NMe84 schreef op 07 juni 2004 @ 22:42:
Waarom überhaupt splitten? Het kan prima vanuit een array.

[...]
Ik mis het concept "array" in je code:?
Bovendien hussel je volgens mij alle karakters door elkaar.. Dan krijg je ook uitvoer als:
code:
1
,3 52 ,c, 6,t,1 ,4 e


@TS: Waarom wordt de data in deze vorm aangeleverd? Komt het uit een DB? Dan kun je het meteen in een array schieten (en uit deze array achter elkaar willekeurige elementen kiezen waarbij je het gekozen element uit de array haalt). Anders moet je het even splitten in een array.

Daarna kun je "join" gebruiken om het weer in een string te schieten gescheiden door een komma.

Of wordt het door een user ingevoerd? Dan moet je er rekening mee houden dat er ook fouten gemaakt kunnen worden (komma's zonder spatie bijvoorbeeld).

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
Ohw, sorry. Vergeten te vermelden.

Het gaat hier om een project waarbij je antwoorden moet maken die uit een database komen. Nu heb je bijvoorbeeld 30 vragen in de database maar ik wil dan zegmaar 15 vragen RANDOM op me scherm tonen.

Dus ik zat er aan te denken om de VraagId op te slaan en tussen elke VraagId een , en dan later daar op splitten en door elkaar gooien. En dan deze gewoon één voor één aflopen om zo de goede vraag uit de DB te pakken met RS.Move (randomVraagId).

Logisch is dan dat er geen dubbele vragen mogen worden vertoond

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

nescafe schreef op 07 juni 2004 @ 22:50:
Ik mis het concept "array" in je code:?
Bovendien hussel je volgens mij alle karakters door elkaar.. Dan krijg je ook uitvoer als:
code:
1
,3 52 ,c, 6,t,1 ,4 e
Schrijffout, bedoelde gewoon "string". :) En ik heb nergens gelezen dat er meer letters tussen die komma's konden staan. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • CrashOne
  • Registratie: Juli 2000
  • Niet online

CrashOne

oOoOoOoOoOoOoOoOoOo

Je kan dan toch gewoon random gebruiken in combinatie met een array (of een dictionary, is hier volgens mij ook wel voor te gebruiken) die je checked op het bestaan van het nummer?

Huur mij in als freelance SEO consultant!


  • nescafe
  • Registratie: Januari 2001
  • Nu online
NMe84 schreef op 07 juni 2004 @ 22:57:
[...]

En ik heb nergens gelezen dat er meer letters tussen die komma's konden staan. :)
Daar heeft mijn voorbeeld niets mee te maken ;)
Polderdijk schreef op 07 juni 2004 @ 22:54:
[...]
En dan deze gewoon één voor één aflopen om zo de goede vraag uit de DB te pakken met RS.Move (randomVraagId).

Logisch is dan dat er geen dubbele vragen mogen worden vertoond
Als je access gebruikt als database:
[google=database select random], derde resultaat: http://lists.evolt.org/ar...-Mon-20040315/156878.html
Als je SQL Server gebruikt... nu ik zo zoek.. dan wordt het iets moeilijker om het direct in de query te doen ;)

edit:
Gevonden: http://aspnet.4guysfromrolla.com/articles/051003-1.aspx m.b.v. [google=sql server random order], 6e resultaat.
SQL:
1
2
3
SELECT ProductID, Name, Description, Price
FROM Products
ORDER BY NEWID()


Waarbij de functie NEWID() iedere keer een nieuwe unique identifier geeft. (Vraag me af of dit performancetechnisch wel verantwoord is, op guid's sorteren)

[ Voor 23% gewijzigd door nescafe op 07-06-2004 23:10 ]

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
Nooit van dictionary gehoord maar na een bezoek aan google weet ik meer :P

Maar nu zit ik nog steeds met het probleem dat ik hiermee dubbele waarden kan genereren. Ik zoek een manier dat ik telkens wat eruit haal en dat dit wordt 'afgestreept' zodat je het niet 2 keer kan gebruiken.

Ik zat dus hieraan te denken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"
Aantal = 10

splString = Split(string, ",")
aantalInString = UBound(splString)


x = 0
Do While x <= Aantal
  Randomize
  randomgetal = CLng(aantalInString * Rnd())
  string2 = string2 & "," & splString(randomgetal)
  'hier moet iets komen zodat het randomgetal uit de array
  'wordt gestreept en dus niet meer gebruik kan worden
  x = x + 1
Loop


Edit:
Als je access gebruikt als database:
In eerste instantie gebruik ik MS SQL, maar het moet waarschijnlijk een Access database gaan worden omdat het 'mobiel' moet gaan worden. Dus eigenlijk moet het werken voor alle 2.

[ Voor 19% gewijzigd door Polderdijk op 07-06-2004 23:10 ]

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Polderdijk schreef op 07 juni 2004 @ 23:08:
Nooit van dictionary gehoord maar na een bezoek aan google weet ik meer :P

Maar nu zit ik nog steeds met het probleem dat ik hiermee dubbele waarden kan genereren. Ik zoek een manier dat ik telkens wat eruit haal en dat dit wordt 'afgestreept' zodat je het niet 2 keer kan gebruiken.

Ik zat dus hieraan te denken:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string = "1,2,3,4,5,6,7,8,9,10,11,12,13,14,15"
Aantal = 10

splString = Split(string, ",")
aantalInString = UBound(splString)


x = 0
Do While x <= Aantal
  Randomize
  randomgetal = CLng(aantalInString * Rnd())
  string2 = string2 & "," & splString(randomgetal)
  'hier moet iets komen zodat het randomgetal uit de array
  'wordt gestreept en dus niet meer gebruik kan worden
  x = x + 1
Loop
Als je dus dat dictionary object gebruikt is er een methode om een element te verwijderen. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
NMe84 schreef op 07 juni 2004 @ 23:10:
[...]

Als je dus dat dictionary object gebruikt is er een methode om een element te verwijderen. ;)
Ahhhh, er gaat een wereld voor me open :D

Ik ga ff verder googlen

Edit:
Klopt, volgens http://www.w3schools.com/asp/asp_ref_dictionary.asp kan het met het remove method!

Ik ga het ff proberen

[ Voor 20% gewijzigd door Polderdijk op 07-06-2004 23:13 ]

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • nescafe
  • Registratie: Januari 2001
  • Nu online
Om nog even terug te komen op mijn edit (topic gaat hard :) ):
Ik denk dat je qua performance de random sortering beter op de server kan uitvoeren dan op je client. Een sql server is erop gebouwd om te sorteren. Het 30 keer verplaatsen van je ado/daocursor (rs.Move) zal denk ik meer tijd kosten.


edit:
Polderdijk schreef op 07 juni 2004 @ 23:08:
[...]
In eerste instantie gebruik ik MS SQL, maar het moet waarschijnlijk een Access database gaan worden omdat het 'mobiel' moet gaan worden. Dus eigenlijk moet het werken voor alle 2.
Ik weet niet hoe deze "mobiele" applicatie gaat werken (meerdere klanten, of portable devices), maar misschien dat de MSDE (Microsoft SQL Server Desktop Edition) uitkomst kan bieden. Dan houd je het sql-dialect wel gelijk.

[ Voor 46% gewijzigd door nescafe op 07-06-2004 23:22 ]

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
Met mobiele applicatie bedoel ik dat het ff hier wordt gebruikt, ff daar. En het wordt niet door echte nerds gebruikt dus MSDE is geen oplossing ben ik bang. Het voordeel van access is beter omdat je gewoon de zip uitpakt en een website op je IIS configgen en klaar!

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Simpele functie om je zooi te husselen:
Visual Basic 6:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Function HusselString(strIn As String, Optional strSplitChar As String = ",") As String
    Dim arrTMP() As String
    Dim T As Long, A As Long, B As Long, U As Long
    
    Dim strSwap As String
    
    arrTMP = Split(strIn, strSplitChar)
    U = UBound(arrTMP)
    If U > 0 Then
        Randomize Timer
        For T = 0 To UBound(arrTMP)
            A = CLng(Rnd * U)
            B = CLng(Rnd * U)
            strSwap = arrTMP(A)
            arrTMP(A) = arrTMP(B)
            arrTMP(B) = strSwap
        Next
    End If
    HusselString = Join(arrTMP, strSplitChar)
End Function


Erg veel makkelijker kan ik het je niet maken :Y)

Aanroepen:
code:
1
2
    Dim newString As String
    newString = HusselString("a,236,124,dfk,jg,wef,fio,7,dnui,23n,wef")


/voorkauw modus ;)

Je bent het me overigens nu wel verschuldigd op de P&W Meeting III te komen :Y) (Zie sig)

/ledenwerf-modus :+

[ Voor 29% gewijzigd door RobIII op 08-06-2004 00:40 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • sjoerdb2
  • Registratie: Juli 2001
  • Laatst online: 09-05-2025
Ik weet dat je in mysql iets kunt doen als:
SELECT * FROM table ORDER BY rand() LIMIT 0,15; heb je daar iets aan?

  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
RobIII schreef op 08 juni 2004 @ 00:36:
Simpele functie om je zooi te husselen:

[..vbcode..]

/voorkauw modus ;)

Je bent het me overigens nu wel verschuldigd op de P&W Meeting III te komen :Y) (Zie sig)

/ledenwerf-modus :+
Geweldig ben je :>

Ik heb het ff zo gemaakt om te laten werken in ASP:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Function Hussel(strIn)
    arrTMP = Split(strIn, ",")
    U = UBound(arrTMP)
    If U > 0 Then
        Randomize Timer
        For T = 0 To UBound(arrTMP)
            A = CLng(Rnd * U)
            B = CLng(Rnd * U)
            strSwap = arrTMP(A)
            arrTMP(A) = arrTMP(B)
            arrTMP(B) = strSwap
        Next
    End If
    Hussel = Join(arrTMP, ",")
End Function

Response.Write Hussel("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16")

En het werkt super. Vanavond implementeren in me ASP pagina en dan moet het lukken!

P.S.
Over die meeting, ik wil graag komen, maar ik beng bang dat ik met me luie r**t in Turkije lig en dan heb ik echt geen zin om terug te komen (of thuis te blijven) voor een meeting :P

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik zou er toch echt nog eens over nadenken om het direct via de NewId() functie in je SQL code te doen. Ik denk dat dat sneller gaat dan de VBScript hussel functie, zeker bij een beperkt aantal records.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Polderdijk
  • Registratie: December 2001
  • Laatst online: 19-05 14:10
P_de_B schreef op 08 juni 2004 @ 08:53:
Ik zou er toch echt nog eens over nadenken om het direct via de NewId() functie in je SQL code te doen. Ik denk dat dat sneller gaat dan de VBScript hussel functie, zeker bij een beperkt aantal records.
Al moest het alleen op SQL server draaien had ik daar echt voor gekozen, alleen het moet dus met Access werken en daar werkt de NewId() functie helaas niet in.

Ook MSDE en al dat soort oplossingen zijn dus voor mij geen optie. En overigens, die hussel optie kan ik, nu ik de werking zie, voor meerdere dingen gaan toepassen! Dus ik ben gewoon blij2 :+

Webhosting van SkyHost.nl: 25 Mb / 1 Gb windows hosting € 4,50 p/m excl.btw!

Pagina: 1