OneRandomSerie

LiveCode is the premier environment for creating multi-platform solutions for all major operating systems - Windows, Mac OS X, Linux, the Web, Server environments and Mobile platforms. Brand new to LiveCode? Welcome!

Moderators: FourthWorld, heatherlaine, Klaus, kevinmiller, robinmiller

Post Reply
jmburnod
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 2729
Joined: Sat Dec 22, 2007 5:35 pm
Contact:

OneRandomSerie

Post by jmburnod » Sun May 01, 2011 11:58 am

Hi all,

I need a function to get a random list of n lines with n2 lines have the same number between 1 and n3
I write it but i'm sur someone have a more elegant way :D

Code: Select all

function OneRandomSerie pNbTot,pNbM,pNbFig 
   --•• return a random list of pNbTot lines with PnbM lines have the same number between 1 and pNbFig
   put empty into rUneSerie
   put random(pNbFig) into tModele --••
   repeat pNbM
      put "UnpNbM"&tModele&return after rUneSerie
      wait 1 milliseconds
   end repeat
   put pNbTot-pNbM into nbl
   put round(pNbM/pNbFig)+1 into nb
   repeat nb
      repeat with i = 1 to pNbFig
         if i = tModele then next repeat
         put i&return after rUneSerie
         wait 1 milliseconds
      end repeat
   end repeat
   put line 1 to pNbTot of rUneSerie into rUneSerie
   sort rUneSerie by random(pNbTot)
   return rUneSerie
end OneRandomSerie
Thank one more

Jean-Marc
https://alternatic.ch

jmburnod
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 2729
Joined: Sat Dec 22, 2007 5:35 pm
Contact:

Re: OneRandomSerie

Post by jmburnod » Sun May 01, 2011 6:02 pm

Hi All,

Forget my previous message, this script work best

Code: Select all

function OneRandomSerie pNbTot,pNbM,pNbFig 
   --•• return a random list of pNbTot lines with PnbM lines have the same number between 1 and pNbFig
   put random(pNbFig) into tModele --••
   
   put empty into rUneSerie
   repeat pNbM
      --put "UnpNbM"&tModele&return after rUneSerie --•• pour dev
      put tModele&return after rUneSerie
      wait 1 milliseconds
   end repeat
   
   put (pNbTot-pNbM)-1 into nbl
   put round(pNbM/pNbFig)+1 into nb
   
   put empty into tAutres
   repeat with i = 1 to pNbFig
      put i&return after tAutres
      wait 1 milliseconds
   end repeat
   
   filter tAutres without tModele
   put the num of lines of tAutres into nbl
   
   put round(pNbTot/nbl) + 1 into NbT
   repeat NbT
      put tAutres&return after rUneSerie
      wait 1 milliseconds
   end repeat
   
   put line 1 to pNbTot of rUneSerie into rUneSerie
   sort rUneSerie by random(pNbTot)
   return rUneSerie
end OneRandomSerie
All the best

Jean-Marc
https://alternatic.ch

BvG
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 1239
Joined: Sat Apr 08, 2006 1:10 pm
Contact:

Re: OneRandomSerie

Post by BvG » Sun May 01, 2011 10:40 pm

I don't understand your code, or your description of what you want to do. Nontheless, I made this:

Code: Select all

function createPseudoRandomList totalLines,linesWithNumbers,maxAllowedNumber
   -- first create those lines witouth numbers
   put totalLines - linesWithNumbers into emptyLineCount
   repeat for emptyLineCount times
      put return after theResult
   end repeat
   -- create lines that have numbers
   repeat for linesWithNumbers times
      put random(maxAllowedNumber) & return after theResult
   end repeat
   --need to delete last return, otherwise there's a line too much
   delete char -1 of theResult
   --randomly order the resulting list, to mix empty lines and numbered ones
   sort theResult by random(the number of lines in theResult)
   --done!
   return theResult
end createPseudoRandomList
General notes: waiting for 1 millisecond within a repeat loop slows your code down A LOT!!!

Repeat for each <chunk type> is the fastest way to do repeat loops, but here there's no easy way to use them.
Various teststacks and stuff:
http://bjoernke.com

Chat with other RunRev developers:
chat.freenode.net:6666 #livecode

jmburnod
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 2729
Joined: Sat Dec 22, 2007 5:35 pm
Contact:

Re: OneRandomSerie

Post by jmburnod » Mon May 02, 2011 6:34 pm

Hi BvG
And thank for your reply
I try to explane what i want

pNbTot = the number of lines i want
pNbM = the num of lines have the same number choosed between 1 and pNbFig
pNbFig = the maxnum of choices

For instance (i use item instead lines)

put OneRandomSerie(6,2,5) return "1,3,2,2,4,5) if tModele = 2

It work well for me but i'm sur there is a best way

Best regards

Jean-Marc
https://alternatic.ch

BvG
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 1239
Joined: Sat Apr 08, 2006 1:10 pm
Contact:

Re: OneRandomSerie

Post by BvG » Mon May 02, 2011 7:15 pm

Ah so no empty lines.

What do you want to do when the numbers don't match up? for example 10,2,3 could produce "1,1,2,2,3,3" but that's not 10 lines at all?
Various teststacks and stuff:
http://bjoernke.com

Chat with other RunRev developers:
chat.freenode.net:6666 #livecode

jmburnod
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 2729
Joined: Sat Dec 22, 2007 5:35 pm
Contact:

Re: OneRandomSerie

Post by jmburnod » Mon May 02, 2011 9:02 pm

Yes, no empty line
What do you want to do when the numbers don't match up? for example 10,2,3 could produce "1,1,2,2,3,3" but that's not 10 lines at all?
No. 10,2,3 produce for instance "3,2,1,2,1,3,2,1,1,2" (in this case tModele = 3)

The important points are
1. The list have pNbTot lines
2. pNbM line with the same number between 1 and pNbFig
3. The others lines with a number between 1 and pnbFig and <> tModele
https://alternatic.ch

BvG
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 1239
Joined: Sat Apr 08, 2006 1:10 pm
Contact:

Re: OneRandomSerie

Post by BvG » Tue May 03, 2011 12:07 am

you're really bad at explaining this :P

why do you introduce another variable suddenly? now it's 4 paremeters (pNbNot, pNbM, pNbFig, tModele), instead of 3?

Also, the main problem is just not explained because "pNbM line with the same number between 1 and pNbFig" does not mean anything to me. Next try of an assumption:

There will be a certain amount of lines, specified in pNBnot.
You want random numbers beteen 1 and maxNumberSize, which you call pNbFig.
In addition you have a rule about one of the random numbers appearing a certain time (pNbM)

i've coded according to the above interpretation of what you say:

Code: Select all

function semiRandomNumbers numberOfLines, maxRandomNumber, specialNumber, amountOfSpecialNumbers
   --first the special number
   repeat for amountOfSpecialNumbers times
      put specialNumber & return after theResult
   end repeat
   --now the rest
   repeat for numberOfLines - amountOfSPecialNumbers times
      put specialNumber into nextNumber
      repeat until nextNumber <> specialNumber
         put random(maxRandomNumber) into nextNumber
      end repeat
      put nextNumber & return after theResult
   end repeat
   --again one return too much
   delete char -1 of theResult
   --randomize
   sort theResult by random(the number of lines in theResult)
   return theResult
end semiRandomNumbers
Various teststacks and stuff:
http://bjoernke.com

Chat with other RunRev developers:
chat.freenode.net:6666 #livecode

jmburnod
VIP Livecode Opensource Backer
VIP Livecode Opensource Backer
Posts: 2729
Joined: Sat Dec 22, 2007 5:35 pm
Contact:

Re: OneRandomSerie

Post by jmburnod » Wed May 04, 2011 12:28 pm

Sorry for the bad explanantion.
And thank for your help
why do you introduce another variable suddenly? now it's 4 paremeters (pNbNot, pNbM, pNbFig, tModele), instead of 3?
No. Only 3 params, "tModele"(specialNumber in this script) is a variable

I changed a part of your script. I want have the maximum of different numbers in the list tOtherNumbers. Random can't do it with a small maxRandomNumber

This script work well for me.

Code: Select all

function semiRandomNumbers numberOfLines, maxRandomNumber, amountOfSpecialNumbers
   --first the special number
   put random(maxRandomNumber) into specialNumber
   repeat for amountOfSpecialNumbers times
      put "*"&specialNumber & return after rsemiRandomNumbers --••"*" to see  specialNumber
   end repeat
   repeat with i = 1 to maxRandomNumber --•• how to avoid this "repeat with" ?
      if i <>specialNumber then
         put i &return after tOtherNumbers
         wait 1 milliseconds
      end  if
   end repeat
   delete char -1 of tOtherNumbers
   --•• Add tOtherNumbers to the rsemiRandomNumbers (not any line)
   put amountOfSpecialNumbers into tNumLine
   repeat until tNumLine > numberOfLines
      put tOtherNumbers &return after rsemiRandomNumbers
      add (maxRandomNumber-1) to tNumLine
   end repeat 
   --•• maeby the num of lines of rsemiRandomNumbers > numberOfLines
   put line 1 to numberOfLines of rsemiRandomNumbers into rsemiRandomNumbers
   sort rsemiRandomNumbers by random(numberOfLines)
   return rsemiRandomNumbers
end semiRandomNumbers
Jean-Marc
https://alternatic.ch

Post Reply