From: bolega
Subject: Random number generation in LISP or using it
Date: 
Message-ID: <0c194ee2-6347-4a46-8932-37d144e9265a@z7g2000vbh.googlegroups.com>
I am a newbie with the following problem.

A the outset let me state that the limitation is that I have to use
this inside emacs to scramble a set of chosen lines like you do
"reverse-region" or "sort-lines". It is possible that I can call some
scheme or clisp functions.

What is a fast(est) method to randomize lines based on the
capabilities of emacs ?

The function "random" does not work in emacs. I guess one get the
start line and end line of a marked region and then use that to
disorder (or re-order) the lines according to a list of random numbers
generated ?

1 -> 5
2 -> 8
3 -> 6
4 -> 9
5 -> 1
6 -> 3
7 -> 2
8 -> 7
9 -> 4

and then use these pairs to reorder the lines. I guess there is a need
for one or two variables to hold the lines, or just a kill or the top
line and go down a certain number of random steps and paste it there ?
Then come back to the top and do the same thing. The type of capacity
I am looking is to randomize about few hundred short lines of about 20
to 30 characters.

In this case one needs to generate a random number that is an integer
and lies between the lines start and end of region. It can be done by
some modulo type operation if available in emacs lisp.

Thanks for any help.
gnuist

From: bolega
Subject: Re: Random number generation in LISP or using it
Date: 
Message-ID: <667292a9-6fa1-4938-88fe-e4e977ab0386@o30g2000vbc.googlegroups.com>
These are operations available via help in emacs but I dont know how
to use cl type operations in lisp defun.


*random-state*'s value is
[cl-random-state-tag -1 30 98807703]
Documentation:
not documented as a variable.
Defined in `cl'.


5x5-crack-randomly is an interactive autoloaded Lisp function in
`5x5'.
[Arg list not available until function definition is loaded.]
Attempt to crack 5x5 using random solutions.


cl-random-time is a compiled Lisp function in `cl'.
(cl-random-time)
not documented


make-random-state is an autoloaded Lisp function in `cl-extra'.
[Arg list not available until function definition is loaded.]
not documented


random is a built-in function.
(random &optional N)
Return a pseudo-random number.
All integers representable in Lisp are equally likely.
  On most systems, this is 28 bits' worth.
With positive integer argument N, return random number in interval
[0,N).
With argument t, set the random number seed from the current time and
pid.



On Jun 10, 8:21 am, bolega <·········@gmail.com> wrote:
> I am a newbie with the following problem.
>
> A the outset let me state that the limitation is that I have to use
> this inside emacs to scramble a set of chosen lines like you do
> "reverse-region" or "sort-lines". It is possible that I can call some
> scheme or clisp functions.
>
> What is a fast(est) method to randomize lines based on the
> capabilities of emacs ?
>
> The function "random" does not work in emacs. I guess one get the
> start line and end line of a marked region and then use that to
> disorder (or re-order) the lines according to a list of random numbers
> generated ?
>
> 1 -> 5
> 2 -> 8
> 3 -> 6
> 4 -> 9
> 5 -> 1
> 6 -> 3
> 7 -> 2
> 8 -> 7
> 9 -> 4
>
> and then use these pairs to reorder the lines. I guess there is a need
> for one or two variables to hold the lines, or just a kill or the top
> line and go down a certain number of random steps and paste it there ?
> Then come back to the top and do the same thing. The type of capacity
> I am looking is to randomize about few hundred short lines of about 20
> to 30 characters.
>
> In this case one needs to generate a random number that is an integer
> and lies between the lines start and end of region. It can be done by
> some modulo type operation if available in emacs lisp.
>
> Thanks for any help.
> gnuist
From: Thomas A. Russ
Subject: Re: Random number generation in LISP or using it
Date: 
Message-ID: <ymiy6s0lzl6.fsf@blackcat.isi.edu>
bolega <·········@gmail.com> writes:

> The function "random" does not work in emacs. 

How does it not work?
It seems to work for me.

> start line and end line of a marked region and then use that to
> disorder (or re-order) the lines according to a list of random numbers
> generated ?

You could look up shuffling algorithms.


  http://en.wikipedia.org/wiki/Shuffle#Shuffling_algorithms
  http://en.wikipedia.org/wiki/Fisher-Yates_shuffle  


[snip]

> In this case one needs to generate a random number that is an integer
> and lies between the lines start and end of region. It can be done by
> some modulo type operation if available in emacs lisp.

You shouldn't need to do that, since the built-in RANDOM function can do
that for you.  Try ^H f random <CR>

-- 
Thomas A. Russ,  USC/Information Sciences Institute
From: Thomas A. Russ
Subject: Re: Random number generation in LISP or using it
Date: 
Message-ID: <ymivdn4lzkb.fsf@blackcat.isi.edu>
bolega <·········@gmail.com> writes:

> The function "random" does not work in emacs. 

How does it not work?
It seems to work for me.

> start line and end line of a marked region and then use that to
> disorder (or re-order) the lines according to a list of random numbers
> generated ?

You could look up shuffling algorithms.


  http://en.wikipedia.org/wiki/Shuffle#Shuffling_algorithms
  http://en.wikipedia.org/wiki/Fisher-Yates_shuffle  


[snip]

> In this case one needs to generate a random number that is an integer
> and lies between the lines start and end of region. It can be done by
> some modulo type operation if available in emacs lisp.

You shouldn't need to do that, since the built-in RANDOM function can do
that for you.  Try ^H f random <CR>

-- 
Thomas A. Russ,  USC/Information Sciences Institute
From: Xah Lee
Subject: Re: Random number generation in LISP or using it
Date: 
Message-ID: <4a993edc-7b68-4e1d-8b08-9eb432c0c54b@h28g2000yqd.googlegroups.com>
On Jun 10, 8:21 am, bolega <·········@gmail.com> wrote:
> I am a newbie with the following problem.
>
> A the outset let me state that the limitation is that I have to use
> this inside emacs to scramble a set of chosen lines like you do
> "reverse-region" or "sort-lines". It is possible that I can call some
> scheme or clisp functions.
>
> What is a fast(est) method to randomize lines based on the
> capabilities of emacs ?
>
> The function "random" does not work in emacs. I guess one get the
> start line and end line of a marked region and then use that to
> disorder (or re-order) the lines according to a list of random numbers
> generated ?
>
> 1 -> 5
> 2 -> 8
> 3 -> 6
> 4 -> 9
> 5 -> 1
> 6 -> 3
> 7 -> 2
> 8 -> 7
> 9 -> 4
>
> and then use these pairs to reorder the lines. I guess there is a need
> for one or two variables to hold the lines, or just a kill or the top
> line and go down a certain number of random steps and paste it there ?
> Then come back to the top and do the same thing. The type of capacity
> I am looking is to randomize about few hundred short lines of about 20
> to 30 characters.
>
> In this case one needs to generate a random number that is an integer
> and lies between the lines start and end of region. It can be done by
> some modulo type operation if available in emacs lisp.
>
> Thanks for any help.
> gnuist

your problem is very easily solved, in fact i have code you can mode a
bit to do exactly what you want.

The simplest solution, for your input size, is simply just to grab
your lines and save as list. Then, randomnize the list, then insert
them one by one. Probably a 20 min job.

i assume you know scheme or common lisp, just not familiar with emacs
lisp features.

To get your lines into list, as a example, see the grab-lines function
here:

• Elisp Lesson: Writing a google-earth Function
  http://xahlee.org/emacs/google-earth.html

or you can see this page, that deals with reading lines one at a time.

• How To Process A File Line By Line In Elisp
  http://xahlee.org/emacs/elisp_process_lines.html

basically, i'd just do this:

• move your cursor to beginning of first line. (Use search-backward on
\n\n.)
• Move your cursor to the beginning of first line. (move-beginning-of-
line)
• save cursor pos as pos1.
• move your cursor to end of line. move-end-of-line
• save cursor pos as pos2.
• use buffer-substring-no-properties to grab the line and push into a
list.
• Repeat above.
• Delete the lines in buffer if you haven't already.
• Once you have lines as a list, call random with list length as arg.
• remove that line from your list and insert into buffer.
• Repeat till you list has length 0.

  Xah
∑ http://xahlee.org/

☄