[erlang-questions] Generating a list of lists containing random numbers
zxq9@REDACTED
zxq9@REDACTED
Tue Jul 3 09:08:18 CEST 2018
On 2018年7月3日火曜日 8時33分12秒 JST Raimo Niskanen wrote:
> On Tue, Jul 03, 2018 at 01:15:17PM +0900, zxq9@REDACTED wrote:
> > On 2018年7月2日月曜日 23時36分10秒 JST Awsaf Rahman wrote:
> > > Hello!
> > >
> > > I am trying to determine the execution time for my matrix multiplication
> > > program and for that I need to generate a large enough List of Lists of
> > > random integers. Say I want to generate a matrix with a 1000 rows (that is
> > > 1000 lists inside a list). Is there any way of doing it? I can generate a
> > > list of random numbers using list comprehension but can't figure out how to
> > > go about building a list of lists.
> >
> > Wheels within wheels, man...
> >
> > -module(genset).
> > -export([generate/1]).
> >
> > generate(Size) ->
> > Generate = fun() -> rand:uniform(1000) end,
> > MakeList = fun() -> populate(Generate, Size, []) end,
> > populate(MakeList, Size, []).
> >
> >
> > populate(_, Size, Acc) when Size < 0 ->
> > Acc;
> > populate(Generate, Size, Acc) ->
> > populate(Generate, Size - 1, [Generate() | Acc]).
> >
> >
> > -Craig
>
> This may be a missing function for the lists module:
>
> buildr(N, Fun, Acc) ->
> buildr(N, Fun, Acc, []).
> %%
> buildr(0, _Fun, Acc, R) ->
> {R, Acc};
> buildr(N, Fun, Acc, R) ->
> {V, NewAcc} = Fun(Acc),
> buildr(N - 1, Fun, NewAcc, [V|R]).
>
> Example usage:
>
> Base = 0,
> Range = 1 bsl 32,
> {ListOfLists, _NewSeed} =
> buildr(
> 1000,
> fun (Seed) ->
> buildr(
> 1000,
> %%fun rand:uniform_s/1,
> fun (S) ->
> {V, NewS} = rand:uniform_s(Range, S),
> {Base + V - 1, NewS}
> end,
> Seed)
> end,
> rand:seed_s(exrop)),
>
>
I think I'd rather have matrix operations in a matrix module.
Every time I've needed to do matrix operations the need has either been:
1)
Trivial, flat matrix operations over regular matrices of regular
dimensions populated by scalar values & a well-defined _|_.
OR
2)
Matrices that are specialized enough that they really deserve a custom
set of handlers all their own.
In case 1 there are enough regular operations (especially against numeric
values) that you could fill out a full-blown matrix_math module and still
not cover everything. I wouldn't want that to clutter the lists module.
In case 2 trying to generalize is futile because remembering the details
of the abstractions involved is more trouble than writing a special handler,
hence things like this:
https://gitlab.com/zxq9/zxWidgets/blob/master/src/zxw.erl#L194
I wouldn't want to attempt to generalize a text grid metawidget generator
because the assumptions embedded in it will break in any other situation,
but nonetheless, it is a matrix operation to generate, populate, and extract
or modify data in it.
I've got a naive matrix math module around here somewhere that I wrote as
an example for a guy on SO a while back... but it only handles a few math
operations, flips, inversions and rotations.
Would people be interested in a matrix_math library?
-Craig
More information about the erlang-questions
mailing list