emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Stig Brautaset <stig@brautaset.org>
To: Uwe Brauer <oub@mat.ucm.es>, emacs-orgmode@gnu.org
Subject: Re: [random sorting] (was: org table: one column of random numbers (but natural ones))
Date: Fri, 29 May 2020 17:52:03 +0100	[thread overview]
Message-ID: <m2o8q6vg3w.fsf@brautaset.org> (raw)
In-Reply-To: <87eer3dm4a.fsf_-_@mat.ucm.es>

Uwe Brauer <oub@mat.ucm.es> writes:

>>>> "SB" == Stig Brautaset <stig@brautaset.org> writes:
>
>    >> > In row 67 you would have a random integer in the range [0..67)
>    >> > f0 format removes any fractional part leaving only an integer number
>    >> 
>    >> Aha thanks, a minor thing, which I thank, cannot be really done:
>    >> 
>    >> Is it possible to avoid number repetition?
>    >> 
>    >> So I want a random sequence of the column 67 but I don't want numbers to
>    >> be repeated.
>
>    > To avoid duplicates you could generate a sequence from [0..67), shuffle
>    > it[1], then use the row number as an index into that list. (Or pop off the
>    > front.) How to do that from an org table function I have no idea,
>    > however.
>
> Thanks I tried in a row of 33
> $5=random([0..34]);f0
> $5=random([0..34));f0
> $5=random([0..33));f0
>
> But random repeats, however org-table-sort-lines sorts anyway
> And what I truly needed is a random sorting of sorts.

Right, I think I failed to make myself understood so here's an example
of what I had in mind. It's not convenient to use (need to execute
a source code block) but hopefully what I mean is a bit clearer, and
someone can clean it up a little :-)

First we need to generate a randomised sequence of unique integer in a
range, using the Knuth shuffle I pointed to earlier. Every time you run
tihs you get a new sequence. I've kept the output more to verify that
the results have unique output, as the table formula later will read
from the lisp variable, IIUC.

#+name: random-seq
#+begin_src emacs-lisp :var length=10 :results list
(defun nshuffle (sequence)
  (loop for i from (length sequence) downto 2
        do (rotatef (elt sequence (random i))
                    (elt sequence (1- i))))
  sequence)

(setq random-seq (nshuffle (number-sequence 0 (1- length))))
#+end_src

#+RESULTS: random-seq
- 5
- 9
- 6
- 0
- 7
- 8
- 3
- 2
- 1
- 4

And now for the table that uses the variable. As we compute the
randomised sequence ahead of time for each invocation of the column
formula, and we can use each row number as an index into the sequence to
assign a unique, randomised integer from a range to each column.

| 0 | 5 |
| 1 | 9 |
| 2 | 6 |
| 3 | 0 |
| 4 | 7 |
| 5 | 8 |
| 6 | 3 |
| 7 | 2 |
| 8 | 1 |
| 9 | 4 |
#+TBLFM: $2='(nth (string-to-number $1) random-seq)


Possible improvements (that I don't think I'm up to making):

1. Don't require the column of indices to use as index into the sequence
2. Show how to do this without having the separate pre-compute step of
   the index (possibly with memoizing a sequence on first use?)

Hope this helps!

Regards,

Stig


  parent reply	other threads:[~2020-05-29 16:52 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-27 20:40 org table: one column of random numbers (but natural ones) Uwe Brauer
2020-05-28  6:06 ` tbanelwebmin
2020-05-28 18:25   ` Uwe Brauer
2020-05-28 20:26     ` Stig Brautaset
2020-05-29 11:19       ` [random sorting] (was: org table: one column of random numbers (but natural ones)) Uwe Brauer
2020-05-29 11:43         ` [random sorting] Eric S Fraga
2020-05-29 16:52         ` Stig Brautaset [this message]
2020-05-28  7:54 ` org table: one column of random numbers (but natural ones) Eric S Fraga
2020-05-28  7:56 ` Eric S Fraga

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m2o8q6vg3w.fsf@brautaset.org \
    --to=stig@brautaset.org \
    --cc=emacs-orgmode@gnu.org \
    --cc=oub@mat.ucm.es \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).