
BBC BASIC's RND Function
Hi all, I have been attempting to use BASIC's RND function to generate a
number between 0 and 14
in a weird attempt to use the stronghelp manual, I tried to use
Highest% = 14
tmp_int% = RND(Highest%)
but the manual says it generates a number between 1 and INT(n) (Highest%
in this case)
in VisualBASIC I can remember generating a number between any to any
(integer wise) using something like:
int_temp = RND(int_Lowest,int_Highest)
so int_Lowest could have been 50 ect
how would I do this in BBC BASIC as I cannot find any reference to this
kind of function
Cheers


0




Reply

Michael

10/12/2007 10:41:15 AM 

See related articles to this posting
In article <fbIPi.75705$yN2.50091@newsfe7gui.ntli.net>,
Michael Emerton <MichaelREmerton@_deleteme_hotmail.com> wrote:
> how would I do this in BBC BASIC as I cannot find any reference to this
> kind of function
Subtract a constant?
Eg,
Highest% = 14
tmp_int% = RND(Highest%)2
will generate a number between 1 and 12.
Best not to capitalise your variables.
John

John Williams, Brittany, Northern France  no attachments to these addresses!
NonRISC OS posters change user to johnrwilliams or put 'risc' in subject
for reliable contact! Who is John Williams? http://www.picindex.info/author/
Somewhere nice to stay in Brittany? http://petit.four.free.fr/visitors/locate


0




Reply

UCEbin (2770)

10/12/2007 10:46:21 AM


> Subtract a constant?
>
> Eg,
>
> Highest% = 14
> tmp_int% = RND(Highest%)2
>
> will generate a number between 1 and 12.
Hmm didn't think of that! :) thanks!
>
> Best not to capitalise your variables.
Damn! better change my progs now then ;@)


0




Reply

Michael

10/12/2007 10:59:49 AM


In article <fbIPi.75705$yN2.50091@newsfe7gui.ntli.net>,
Michael Emerton <MichaelREmerton@_deleteme_hotmail.com> wrote:
> Hi all, I have been attempting to use BASIC's RND function to
> generate a number between 0 and 14
> in a weird attempt to use the stronghelp manual, I tried to use
> Highest% = 14
> tmp_int% = RND(Highest%)
> but the manual says it generates a number between 1 and INT(n)
> (Highest% in this case)
> in VisualBASIC I can remember generating a number between any to
> any (integer wise) using something like:
> int_temp = RND(int_Lowest,int_Highest)
BASICs vary. RND doubly so. :p
To get a random number between 0 and n in BBC BASIC, use RND(n+1)1
The RND(n+1) gives you a random number between 1 and 1 /more/ than
your upper limit, and the 1 then deducts 1 from that number  so the
result is between 0 and n.
> so int_Lowest could have been 50 ect
> how would I do this in BBC BASIC as I cannot find any reference to
> this kind of function
An equivalent to the VB function you describe[1] would be:
DEF FN_VBRND(lowest%,highest%)=RND(highest%lowest%+1)+lowest%1
[1] Which doesn't seem to be what I remember it being in VB, but
never mind. :)

http://www.softrock.co.uk
http://www.riscository.com
http://www.webchange.co.uk
http://www.vinceh.com


0




Reply

spam5752 (1717)

10/12/2007 11:09:23 AM


>> in VisualBASIC I can remember generating a number between any to
>> any (integer wise) using something like:
>
>> int_temp = RND(int_Lowest,int_Highest)
>
> An equivalent to the VB function you describe[1] would be:
>
> DEF FN_VBRND(lowest%,highest%)=RND(highest%lowest%+1)+lowest%1
>
> [1] Which doesn't seem to be what I remember it being in VB, but
> never mind. :)
My memory must be failing :P was over 7 years ago since I last used a
random generator!


0




Reply

Michael

10/12/2007 11:41:18 AM


In article <y3JPi.15665$DB2.7179@newsfe1win.ntli.net>,
Michael Emerton <MichaelREmerton@_deleteme_hotmail.com> wrote:
> My memory must be failing :P was over 7 years ago since I last used a
> random generator!
Also note that putting a ve number into RND will initialise the
pseudorandom number sequence. So if you need a repeatable pattern of
randomish behaviour, doing:
IF RND(1)
would start the sequence at 1.
If you want a much _more_ random number generator, take a look at the
CryptRandom module at:
http://www.chiark.greenend.org.uk/~theom/riscos/crypto/
I think you can then simply do:
SYS "CryptRandom_Word" TO rnd%
to give you a random value (but not in a specific range). To get it into a
specific range (from 0 to n1) you'd add something like:
word% = ABS(word% MOD range%)
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/12/2007 12:45:14 PM


Michael Emerton wrote:
> Hi all, I have been attempting to use BASIC's RND function to generate a
> number between 0 and 14
>
> in a weird attempt to use the stronghelp manual, I tried to use
>
> Highest% = 14
> tmp_int% = RND(Highest%)
>
> but the manual says it generates a number between 1 and INT(n) (Highest%
> in this case)
>
> in VisualBASIC I can remember generating a number between any to any
> (integer wise) using something like:
>
> int_temp = RND(int_Lowest,int_Highest)
>
> so int_Lowest could have been 50 ect>
>
> how would I do this in BBC BASIC as I cannot find any reference to this
> kind of function
Try:
int_temp = FNrnd(int_Lowest,int_Highest)
END
DEF FNrnd(L%,H%) = L%+RND(H%L%+1)1

; ,', * Basalt *  gives RO 3.10+ versions of BASIC V new and alternative
;,' keywords, dynamic memory for arrays and blocks, new variable types.
;', Legal, fast and simple to use. Freeware  version 0.98�  19 Aug 03
,; ',, Steve Drain, Kappa : http://www.kappa.me.uk/basalt.htm


0




Reply

steve3677 (307)

10/12/2007 12:49:18 PM


In article <4f309fbd4bsteve@revi11.plus.com>,
Ste (news) <steve@revi11.plus.com> wrote:
> SYS "CryptRandom_Word" TO rnd%
^^^^
word% of course
> word% = ABS(word% MOD range%)
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/12/2007 1:45:15 PM


Ste (news) wrote:
> In article <4f309fbd4bsteve@revi11.plus.com>,
> Ste (news) <steve@revi11.plus.com> wrote:
>> SYS "CryptRandom_Word" TO rnd%
> ^^^^
> word% of course
>> word% = ABS(word% MOD range%)
>
> Steve
>
cool!
cheers to all that helped, I will try them out one by one :@)
Michael


0




Reply

Michael

10/12/2007 1:49:47 PM


On Oct 12, 1:45 pm, "Ste (news)" <st...@revi11.plus.com> wrote:
> If you want a much _more_ random number generator, take a look at the
> CryptRandom module at:
>
> http://www.chiark.greenend.org.uk/~theom/riscos/crypto/
Somewhat OT: it's often not appreciated just how poor BASIC's RND() is
for some tasks. A classic example is shuffling a pack of cards.
There are 52! possible arrangements of cards in a standard pack
(excluding jokers); that's about 8 * 10^67. The total number of
possible different sequences returned from RND() is 2^33, or about 8 *
10^9. So only about 1 in 10^58 of all the possible arrangements of
cards in a pack will *ever* be generated by a given shuffling routine
based solely on BASIC's RND, however involved it is. Quite a
staggering statistic, if you haven't met it before.
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/12/2007 3:54:45 PM


On Fri, 12 Oct 2007 08:54:45 0700, Richard Russell wrote:
> Somewhat OT: it's often not appreciated just how poor BASIC's RND() is
> for some tasks. A classic example is shuffling a pack of cards. There
> are 52! possible arrangements of cards in a standard pack (excluding
> jokers); that's about 8 * 10^67. The total number of possible different
> sequences returned from RND() is 2^33, or about 8 * 10^9. So only about
> 1 in 10^58 of all the possible arrangements of cards in a pack will
> *ever* be generated by a given shuffling routine based solely on BASIC's
> RND, however involved it is. Quite a staggering statistic, if you
> haven't met it before.
What do you mean by "total number of possible different sequences
returned from RND() is 2^33" ? Is that for a given seed? For a given
range? I'd assume, that given it returns a 32 bit integer, there are
2^32 different values it can return, and assuming it's not a completely
dire algorithm, most combinations of those 2^32 numbers should be
possible to be generated.
Your assertion here feels like it's missing something, but I can't quite
place what.
B.


0




Reply

nntp550 (4244)

10/12/2007 4:45:42 PM


In article <470fa4b5$0$8429$db0fefd9@news.zen.co.uk>,
Rob Kendrick <nntp@rjek.com> wrote:
> On Fri, 12 Oct 2007 08:54:45 0700, Richard Russell wrote:
>
> > Somewhat OT: it's often not appreciated just how poor BASIC's RND() is
> > for some tasks. A classic example is shuffling a pack of cards. There
> > are 52! possible arrangements of cards in a standard pack (excluding
> > jokers); that's about 8 * 10^67. The total number of possible different
> > sequences returned from RND() is 2^33, or about 8 * 10^9. So only about
> > 1 in 10^58 of all the possible arrangements of cards in a pack will
> > *ever* be generated by a given shuffling routine based solely on BASIC's
> > RND, however involved it is. Quite a staggering statistic, if you
> > haven't met it before.
>
> Your assertion here feels like it's missing something, but I can't quite
> place what.
I think the missing bit is (and this is a guess) that Richard's assertion
may well be true for generating a shuffled pack _in one pass_. If however,
the algorithm does something like:
loop n times (and/or for n centiseconds whilst multitasking)
swap card at position RND with card at position RND
then surley there's nothing to stop you getting at all possible orders of
cards (given enough shuffles) because BASIC's RND function is based upon a
33 bits accumulator from which we're only interested in 0..51?
I do agree that it's well worth introducing some other factor which isn't so
algorithmic, like the multitasking because that can be affected by other
stuff going on in the desktop and the user's actions.
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/12/2007 5:45:10 PM


In message <4f309fbd4bsteve@revi11.plus.com>
"Ste (news)" <steve@revi11.plus.com> wrote:
> In article <y3JPi.15665$DB2.7179@newsfe1win.ntli.net>,
> Michael Emerton <MichaelREmerton@_deleteme_hotmail.com> wrote:
> > My memory must be failing :P was over 7 years ago since I last used a
> > random generator!
>
> Also note that putting a ve number into RND will initialise the
> pseudorandom number sequence. So if you need a repeatable pattern of
> randomish behaviour
Or a neat little hashing function :)

Rik Griffin


0




Reply

rik.griffin (20)

10/12/2007 6:58:58 PM


On 12 Oct 2007 Richard Russell <news@rtrussell.co.uk> wrote:
> Somewhat OT: it's often not appreciated just how poor BASIC's RND() is
> for some tasks. A classic example is shuffling a pack of cards.
> There are 52! possible arrangements of cards in a standard pack
> (excluding jokers); that's about 8 * 10^67. The total number of
> possible different sequences returned from RND() is 2^33, or about 8 *
> 10^9. So only about 1 in 10^58 of all the possible arrangements of
> cards in a pack will *ever* be generated by a given shuffling routine
> based solely on BASIC's RND, however involved it is. Quite a
> staggering statistic, if you haven't met it before.
No, the psuedo random number generator returns sequence of 32bit
numbers, the full sequence repeat length is 2^33 values. All 32bit
values occur in this sequence, but not necessarily with precisely
equal frequency.
It is possible to generate all possible combinations of 52 cards with
this generator, unless your algorithm is broken. The most common
mystake in using BASIC's RND is not to seed it before starting, which
will tend to result in exactly the same sequence every time.
The common way to seed is to use RND(TIME), but you should bear in
mind that TIME is reset at reboot, so will not be sufficent if used in
a turn key system. Ideal a seed value based on part of the 5 byte real
time clock should be used.
druck

The ARM Club Free Software  http://www.armclub.org.uk/free/
The 32bit Conversions Page  http://www.quantumsoft.co.uk/druck/


0




Reply

news5843 (7460)

10/12/2007 7:14:47 PM


On Oct 12, 5:45 pm, Rob Kendrick <n...@rjek.com> wrote:
> What do you mean by "total number of possible different sequences
> returned from RND() is 2^33" ? Is that for a given seed? For a given
> range?
For a "given seed" there is only one sequence (of a certain length)
that it can generate! Since there are only 2^31 possible seeds a
'seeded' generator can produce only that number of different
sequences. An 'unseeded' generator can produce only a maximum of 2^33
different sequences.
> I'd assume, that given it returns a 32 bit integer, there are
> 2^32 different values it can return, and assuming it's not a completely
> dire algorithm, most combinations of those 2^32 numbers should be
> possible to be generated.
By your definition then, it's a "dire algorithm".
> Your assertion here feels like it's missing something, but I can't quite
> place what.
The very reason I mentioned it is because it is so surprising and
counterintuitive, but it is nevertheless correct.
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/12/2007 10:01:53 PM


On Fri, 12 Oct 2007 20:14:47 +0100, druck wrote:
> Ideal a seed value based on part of the 5 byte real time
> clock should be used.
Preferably with some of the least significant 16 bits of this being in
there  I've seen code that uses the first (MS) 16 bits of the monotonic
timer, and it doesn't have the unpredictability the author would have
wanted.
B.


0




Reply

nntp550 (4244)

10/12/2007 10:07:03 PM


On Oct 12, 6:45 pm, "Ste (news)" <st...@revi11.plus.com> wrote:
> I think the missing bit is (and this is a guess) that Richard's assertion
> may well be true for generating a shuffled pack _in one pass_. If however,
> the algorithm does something like:
>
> loop n times (and/or for n centiseconds whilst multitasking)
> swap card at position RND with card at position RND
>
> then surley there's nothing to stop you getting at all possible orders of
> cards (given enough shuffles) because BASIC's RND function is based upon a
> 33 bits accumulator from which we're only interested in 0..51?
There is nothing you can do, short of introducing a different source
of 'randomness', to increase the number of possible sequences above
2^33.
Think about it. Any algorithm you may devise, however convoluted,
which uses RND() as its sole source of 'randomness' must produce the
same sequence given the same starting conditions  it's not magic!
Since there are only 2^33 different starting conditions, there can
only be 2^33 different sequences.
> I do agree that it's well worth introducing some other factor which isn't so
> algorithmic, like the multitasking because that can be affected by other
> stuff going on in the desktop and the user's actions.
If you can introduce an additional source of 'randomness' then you can
exceed the 2^33 limit, but how do you propose to use 'multitasking' to
achieve that in a quantifiable way?
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/12/2007 10:10:37 PM


On Oct 12, 8:14 pm, druck <n...@druck.freeuk.com> wrote:
> It is possible to generate all possible combinations of 52 cards with
> this generator, unless your algorithm is broken.
Rubbish. See my other replies for the explanation.
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/12/2007 10:11:19 PM


In message <3d67c3304f.druck@druck.freeuk.net>
druck <news@druck.freeuk.com> wrote:
> On 12 Oct 2007 Richard Russell <news@rtrussell.co.uk> wrote:
>> Somewhat OT: it's often not appreciated just how poor BASIC's RND() is
>> for some tasks. A classic example is shuffling a pack of cards.
>> There are 52! possible arrangements of cards in a standard pack
>> (excluding jokers); that's about 8 * 10^67. The total number of
>> possible different sequences returned from RND() is 2^33, or about 8 *
>> 10^9. So only about 1 in 10^58 of all the possible arrangements of
>> cards in a pack will *ever* be generated by a given shuffling routine
>> based solely on BASIC's RND, however involved it is. Quite a
>> staggering statistic, if you haven't met it before.
> No, the psuedo random number generator returns sequence of 32bit
> numbers, the full sequence repeat length is 2^33 values. All 32bit
> values occur in this sequence, but not necessarily with precisely
> equal frequency.
> It is possible to generate all possible combinations of 52 cards with
> this generator, unless your algorithm is broken.
No, as Richard has pointed out, this is not possible. It follows from
the vast number of permutations that exist, the limited cycle length
of the generator and the fact that computers are deterministic.
> It is possible to generate all possible combinations of 52 cards with
> this generator, unless your algorithm is broken. The most common
> mystake in using BASIC's RND is not to seed it before starting, which
> will tend to result in exactly the same sequence every time.
There, you have given the solution yourself. If you have the same
starting seed, you get the same arrangement of cards at the end.
Agreed? Now, you only need to consider how many different starting
seeds we have. Due to technical reasons even less than 2^33, but even
if we could seed the generator with each of its possible 2^33 states,
then we could only ever generate 2^33 different results from the
program (and in practice even fewer because not all of the results
need to be different)  and that is dramatically less than the 52!
possible permutations of the cards.
This is not really surprising  after all, there is no randomness in a
computer and the only source of "randomness" you have in the whole
affair is the choice of the original seed. Things get even worse when
you consider how that original seed is usually chosen. System time
(TIME in BASIC) is popular. That only covers a tiny part of the entire
2^32 range in the majority of cases because most desktop computers are
only switched on during the day. You need to have the machine switched
on for 11930 hours to use the full range of TIME.
Martin


Martin Wuerthner MW Software http://www.mwsoftware.com/
ArtWorks 2  Designing stunning graphics has never been easier
spamtrap@mwsoftware.com [replace "spamtrap" by "info" to reply]


0




Reply

spamtrap3075 (2307)

10/12/2007 10:24:35 PM


In article <1192227037.473264.13560@z24g2000prh.googlegroups.com>,
Richard Russell <news@rtrussell.co.uk> wrote:
> If you can introduce an additional source of 'randomness' then you can
> exceed the 2^33 limit, but how do you propose to use 'multitasking' to
> achieve that in a quantifiable way?
Use some function of the high resolution timer to reseed the random number
generator based upon the time between entering and returning from Wimp_Poll.
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/14/2007 1:32:46 PM


On 14 Oct 2007 "Ste (news)" <steve@revi11.plus.com> wrote:
> In article <1192227037.473264.13560@z24g2000prh.googlegroups.com>,
> Richard Russell <news@rtrussell.co.uk> wrote:
>> If you can introduce an additional source of 'randomness' then you can
>> exceed the 2^33 limit, but how do you propose to use 'multitasking' to
>> achieve that in a quantifiable way?
> Use some function of the high resolution timer to reseed the random number
> generator based upon the time between entering and returning from Wimp_Poll.
That depends on what's running and whether the user is doing anything,
otherwise it may not be very variable. Use my !APPstat from the fisrt
link below to examine the wimp event timings to microsecond
resolution.
A slightly more random seed can be generated form the time between
user key presses. I think the CryptRandom module uses this, so that
would be a good place to look.
druck

The ARM Club Free Software  http://www.armclub.org.uk/free/
The 32bit Conversions Page  http://www.quantumsoft.co.uk/druck/


0




Reply

news5843 (7460)

10/14/2007 6:15:32 PM


"Ste (news)" <steve@revi11.plus.com> wrote:
> In article <1192227037.473264.13560@z24g2000prh.googlegroups.com>,
> Richard Russell <news@rtrussell.co.uk> wrote:
> > If you can introduce an additional source of 'randomness' then you can
> > exceed the 2^33 limit, but how do you propose to use 'multitasking' to
> > achieve that in a quantifiable way?
>
> Use some function of the high resolution timer to reseed the random number
> generator based upon the time between entering and returning from Wimp_Poll.
CryptRandom attempts to hoover up as much entropy ('randomness') as it can.
This is basically based on three sources:
Human generated:
Keypresses, mouse movements, timestamps for them
Nontransient (ie retained over reboots):
HD directory structure, HD free space, battery voltages, real time clock
Seed saved in Choices: over reboots
System environment (much weaker):
OS version, monotonic time, current dynamic areas, contents of Wimp$ScrapDir
These are repeatedly hashed together in an attempt to mix up the bits as
much as possible, and then the access SWIs read bits from the pool, hashing
as they go. There's also an interface to the pool through accessing
/dev/urandom from UnixLiblinked programs.
What I don't currently provide is guaranteed entropy (as /dev/random does on
Unix) where the system waits until it has enough bits of entropy to fulfill
a request. Partly because this API doesn't work on RISC OS  you'd have to
query the module for how many bits of entropy were available, and then
another process might have grabbed them before you got around to requesting
them. Partly because it's difficult to estimate the entropy of each source
in anything other than a very conservative way (how much entropy in a
keypress? If the user is typing English, not much). And partly because
there's usually much less happening on a RISC OS machine so fewer sources of
entropy.
Seeding the random number generator is a good way to produce longer
sequences, but remember the entropy in the system is still the 32 bit random
seed. If you're using this to generate crypto keys, for example, that means
you only have 2^32 possible keys because you only have 2^32 seeds (and the
rest of the process is deterministic)  and a 32 bit key is trivial to
bruteforce these days. Hence the need for more entropy in the system.
Theo


0




Reply

news539 (2442)

10/14/2007 7:30:12 PM


druck <news@druck.freeuk.com> wrote:
> That depends on what's running and whether the user is doing anything,
> otherwise it may not be very variable. Use my !APPstat from the fisrt
> link below to examine the wimp event timings to microsecond
> resolution.
There are three sources I can think of possible randomness there. The
biggest is user actions, but let's assume everything was run automatically
so that doesn't apply. The others are quite small, so it's difficult to
measure them. The first is hard disc latency, which will depend on the
initial position of the disc and turbulence (there's an interesting paper on
this here: http://world.std.com/~dtd/random/forward.ps )
The second is phase noise: taking the difference of two decoupled clocks
will produce randomised jitter between them. This might be the case if the
DRAM runs off a different clock from the CPU, and they're not synchronised 
this would show through jitter in memory access times. But lack of
synchronisation is the bane of a designer's life (metastability issues) so
is avoided wherever possible, and power supply noise has a habit of pulling
desynchronised clocks into line.
Linux uses disc latencies to provide randomness, which isn't something
that's feasible for thirdparty code on RISC OS. Clock jitter would be
difficult to measure noninvasively, though many smartcards have a random
number generator that operates on this principle.
Theo


0




Reply

news539 (2442)

10/14/2007 9:29:52 PM


In message <yGt*rUjXr@news.chiark.greenend.org.uk>
Theo Markettos <theom+news@chiark.greenend.org.uk> wrote:
> "Ste (news)" <steve@revi11.plus.com> wrote:
> > In article <1192227037.473264.13560@z24g2000prh.googlegroups.com>,
> > Richard Russell <news@rtrussell.co.uk> wrote:
> > > If you can introduce an additional source of 'randomness' then
> > > you can exceed the 2^33 limit, but how do you propose to use
> > > 'multitasking' to achieve that in a quantifiable way?
> >
> > Use some function of the high resolution timer to reseed the random
> > number generator based upon the time between entering and returning
> > from Wimp_Poll.
>
> CryptRandom attempts to hoover up as much entropy ('randomness') as
> it can. This is basically based on three sources:
[SNIP]
> Seeding the random number generator is a good way to produce longer
> sequences, but remember the entropy in the system is still the 32 bit
> random seed. If you're using this to generate crypto keys, for
> example, that means you only have 2^32 possible keys because you only
> have 2^32 seeds (and the rest of the process is deterministic)  and
> a 32 bit key is trivial to bruteforce these days. Hence the need
> for more entropy in the system.
One thing that has been missed in this thread is the purpose for which
the stream is needed.
If the only requirement is a much longer cycle length than RND (while
retaining the ability to guarantee repeatability by seeding it), then
it shouldn't take much ingenuity to implement a BASIC version of the
Mersenne Twister (cycle length 2^19937  1), which is pretty fast[1]
for a generator of such cycle length.
http://en.wikipedia.org/wiki/Mersenne_twister
MT has some flaws that make it inappropriate for cryptography, though.
[1] My test implementation on x86 hardware showed it is pretty much the
same as the standard C Knuth generator.

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/15/2007 6:14:28 PM


In message <a96349324f.tigger@bc63.orpheusinternet.co.uk>
Nick Roberts <tigger@orpheusinternet.co.uk> wrote:
> In message <yGt*rUjXr@news.chiark.greenend.org.uk>
> Theo Markettos <theom+news@chiark.greenend.org.uk> wrote:
>> Seeding the random number generator is a good way to produce longer
>> sequences, but remember the entropy in the system is still the 32 bit
>> random seed. If you're using this to generate crypto keys, for
>> example, that means you only have 2^32 possible keys because you only
>> have 2^32 seeds (and the rest of the process is deterministic)  and
>> a 32 bit key is trivial to bruteforce these days. Hence the need
>> for more entropy in the system.
> One thing that has been missed in this thread is the purpose for which
> the stream is needed.
Not at all, we have been discussing the all important task of
shuffling cards, which turned out to be surprisingly difficult. :)
> If the only requirement is a much longer cycle length than RND (while
> retaining the ability to guarantee repeatability by seeding it), then
> it shouldn't take much ingenuity to implement a BASIC version of the
> Mersenne Twister (cycle length 2^19937  1), which is pretty fast[1]
> for a generator of such cycle length.
The standard implementation of MT 19937 has a 32bit seed, so we are
back to a maximum of 2^32 different arrangements of the cards, no
matter how big the cycle length is. :( In fact, the cycle length is
not really that important for this particular application. It is
important in that it limits the starting entropy because you cannot
have more different seed values than the length of the cycle. Unless
you have at least 226 bits of entropy to start with (i.e., in the
seed) it is impossible to achieve all permutations of a pack of 52
cards.
It should be possible to create MTs with larger word lengths but then,
I suppose that speed will suffer.
Martin


Martin Wuerthner MW Software http://www.mwsoftware.com/
ArtWorks 2  Designing stunning graphics has never been easier
spamtrap@mwsoftware.com [replace "spamtrap" by "info" to reply]


0




Reply

spamtrap3075 (2307)

10/15/2007 9:18:52 PM


On Oct 15, 7:14 pm, Nick Roberts <tig...@orpheusinternet.co.uk> wrote:
> it shouldn't take much ingenuity to implement a BASIC version of the
> Mersenne Twister (cycle length 2^19937  1)
I have listed below a BBC BASIC for Windows implementation of the
MT19937 algorithm, which wouldn't need much modification to run under
RISC OS (it uses a tiny amount of assembler code, and a couple of
PRIVATE variables which would have to be changed to globals).
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.
REM MT19937 Mersenne Twister by Richard Russell
seed% = FNmersenne(ABS(TIME))
FOR N% = 1 TO 30
PRINT FNmersenne(52)
NEXT
END
DEF FNmersenne(R%)
PRIVATE MT%(), J%
LOCAL I%, Y%
DIM MT%(623)
IF R%<0 THEN
LOCAL A%, B%, C%, P%, Q%
DIM P% LOCAL 20
[OPT 2:.Q% mov edx,eax:shr eax,30:xor eax,edx:mul ebx:add
eax,ecx:ret:]
MT%(0) = R%
B% = 1812433253
FOR C% = 1 TO 623
A% = MT%(C%1)
MT%(C%) = USR(Q%)
NEXT
J% = 624
= R%
ENDIF
REPEAT
IF J% = 624 THEN
REM Generate an array of 624 untempered numbers:
FOR I% = 0 TO 623
Y% = (MT%(I%) AND &80000000) OR (MT%((I%+1) MOD 624) AND
&7FFFFFFF)
MT%(I%) = MT%((I% + 397) MOD 624) EOR (Y% >>> 1)
IF (Y% AND 1) MT%(I%) EOR= &9908B0DF
NEXT
J% = 0
ENDIF
REM Extract a tempered pseudorandom 32bit number:
Y% = MT%(J%)
J% += 1
Y% EOR= Y% >>> 11
Y% EOR= (Y% << 7) AND &9D2C5680
Y% EOR= (Y% << 15) AND &EFC60000
Y% EOR= Y% >>> 18
IF R%<=0 THEN = Y% : REM Return 32bit integer
UNTIL (Y% AND &7FFFFFFF) < ((&7FFFFFFF DIV R%) * R%)
= (Y% AND &7FFFFFFF) MOD R% + 1 : REM Return value in range 1 to
R%


0




Reply

news1075 (671)

10/15/2007 9:25:06 PM


In message <a1455a324f.martin@bach.planiverse.com>
Martin Wuerthner <spamtrap@mwsoftware.com> wrote:
> In message <a96349324f.tigger@bc63.orpheusinternet.co.uk>
> Nick Roberts <tigger@orpheusinternet.co.uk> wrote:
>
[snip]
> > one thing that has been missed in this thread is the purpose for
> > which the stream is needed.
>
> Not at all, we have been discussing the all important task of
> shuffling cards, which turned out to be surprisingly difficult. :)
I noted the shuffling cards, but that wasn't what started the thread...
>
> > If the only requirement is a much longer cycle length than RND
> > (while retaining the ability to guarantee repeatability by seeding
> > it), then it shouldn't take much ingenuity to implement a BASIC
> > version of the Mersenne Twister (cycle length 2^19937  1), which
> > is pretty fast[1] for a generator of such cycle length.
>
> The standard implementation of MT 19937 has a 32bit seed, so we are
> back to a maximum of 2^32 different arrangements of the cards, no
> matter how big the cycle length is. :( In fact, the cycle length is
> not really that important for this particular application. It is
> important in that it limits the starting entropy because you cannot
> have more different seed values than the length of the cycle. Unless
> you have at least 226 bits of entropy to start with (i.e., in the
> seed) it is impossible to achieve all permutations of a pack of 52
> cards.
> It should be possible to create MTs with larger word lengths but
> then, I suppose that speed will suffer.
There's no need to have a larger word length, surely. You should be
able to seed each of the 624 dimensions with a separate seed, giving
you a seed of 624 * 32 bits. The classic implementation of initializing
each of the 623 subsequent words with 69069 times the previous one is
simply applying a fairly crude multiplicative congruential RNG to each
word.
OK, you then need a mechanism to seed each word rather than using a
single 32bit word, but in principle that is achievable.
An application I had at work had a need for a cycle length of approx
10^60, but unfortunately it also had to be multiplicative congruential
(it had to be possible to generate the nth number in the sequence
without generating the n1 numbers in between, and to the best of my
knowledge only MC RNGs have this property). That was a monster...

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/16/2007 5:09:52 PM


On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
> An application I had at work had a need for a cycle length of approx
> 10^60, but unfortunately it also had to be multiplicative congruential
> (it had to be possible to generate the nth number in the sequence
> without generating the n1 numbers in between, and to the best of my
> knowledge only MC RNGs have this property). That was a monster...
How random did it have to be? If it doesn't have to be *that* random, a
simple solution springs to mind: use a cryptographic hash over counter.
B.


0




Reply

nntp550 (4244)

10/17/2007 6:40:08 PM


In article <47165708$0$13932$fa0fcedb@news.zen.co.uk>,
Rob Kendrick <nntp@rjek.com> wrote:
> On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
>
> > An application I had at work had a need for a cycle length of approx
> > 10^60, but unfortunately it also had to be multiplicative congruential
> > (it had to be possible to generate the nth number in the sequence
> > without generating the n1 numbers in between, and to the best of my
> > knowledge only MC RNGs have this property). That was a monster...
>
> How random did it have to be? If it doesn't have to be *that* random, a
> simple solution springs to mind: use a cryptographic hash over counter.
Or use value n to seed a RNG then take the next number that pops out of that
RNG, assuming that will be the same each time for a given n. Not quite as
elegant as Rob's solution but if the RNG was good, I would expect it to work
OK.
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/17/2007 8:08:01 PM


On Oct 16, 6:09 pm, Nick Roberts <tig...@orpheusinternet.co.uk> wrote:
> The classic implementation of initializing each of the 623 subsequent
> words with 69069 times the previous one is simply applying a fairly
> crude multiplicative congruential RNG to each word.
That method is known to be weak. See this page:
http://www.math.sci.hiroshimau.ac.jp/~mmat/MT/MT2002/emt19937ar.html
The BBC BASIC version I posted earlier in the thread uses an improved
initialisation algorithm based on the code here:
http://oku.edu.mieu.ac.jp/~okumura/cplusplus/mt19937.cc
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/17/2007 9:34:41 PM


On Wed, 17 Oct 2007 14:34:41 0700, Richard Russell wrote:
> On Oct 16, 6:09 pm, Nick Roberts <tig...@orpheusinternet.co.uk> wrote:
>> The classic implementation of initializing each of the 623 subsequent
>> words with 69069 times the previous one is simply applying a fairly
>> crude multiplicative congruential RNG to each word.
>
> That method is known to be weak. See this page:
This obviously has ramifications for cryptographic or simulation
purposes, but for shuffling a deck of cards, I'm not so sure.
B.


0




Reply

nntp550 (4244)

10/17/2007 9:57:42 PM


On Oct 17, 10:57 pm, Rob Kendrick <n...@rjek.com> wrote:
> This obviously has ramifications for cryptographic or simulation
> purposes, but for shuffling a deck of cards, I'm not so sure.
Probably not, but the 'improved' method isn't significantly more
complicated so one might as well use it for all applications. I've
used assembler code because it involves an integer multiplication with
a greaterthan32bit result, which is messy to do in BASIC.
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/17/2007 10:25:38 PM


On Wed, 17 Oct 2007 15:25:38 0700, Richard Russell wrote:
> I've used
> assembler code because it involves an integer multiplication with a
> greaterthan32bit result, which is messy to do in BASIC.
Time to extend BBC Basic again, and add something akin to C's long
long? :)
B.


0




Reply

nntp550 (4244)

10/17/2007 10:31:44 PM


Rob Kendrick <nntp@rjek.com> wrote:
> On Wed, 17 Oct 2007 14:34:41 0700, Richard Russell wrote:
>
> > On Oct 16, 6:09 pm, Nick Roberts <tig...@orpheusinternet.co.uk> wrote:
> >> The classic implementation of initializing each of the 623 subsequent
> >> words with 69069 times the previous one is simply applying a fairly
> >> crude multiplicative congruential RNG to each word.
> >
> > That method is known to be weak. See this page:
>
> This obviously has ramifications for cryptographic or simulation
> purposes, but for shuffling a deck of cards, I'm not so sure.
Try asking any of the online gaming companies for an opinion on that :)

Stewart Brodie


0




Reply

stewart.brodie (383)

10/18/2007 12:42:02 AM


On 17 Oct, 23:31, Rob Kendrick <n...@rjek.com> wrote:
> On Wed, 17 Oct 2007 15:25:38 0700, Richard Russell wrote:
> > I've used
> > assembler code because it involves an integer multiplication with a
> > greaterthan32bit result, which is messy to do in BASIC.
>
> Time to extend BBC Basic again, and add something akin to C's long
> long? :)
Or just write a procedure.
long_a=FNlong_assign(whatever)
long_b=FNlong_assign(whatever)
PROClong_mult(long_a, long_b, long_result)
PRINT FNlong_text(long_result)

JGH


0




Reply

jgh2 (975)

10/18/2007 6:47:51 AM


On Thu, 18 Oct 2007 00:42:02 +0000, Stewart Brodie wrote:
>> >> The classic implementation of initializing each of the 623
>> >> subsequent words with 69069 times
>> >
>> > That method is known to be weak. See this page:
>>
>> This obviously has ramifications for cryptographic or simulation
>> purposes, but for shuffling a deck of cards, I'm not so sure.
>
> Try asking any of the online gaming companies for an opinion on that :)
Are many of their systems written in BBC Basic? :) I suspect they're
written in something like Java, which scares me even more.
B.


0




Reply

nntp550 (4244)

10/18/2007 9:57:33 AM


On Wed, 17 Oct 2007 18:40:08 +0000, Rob Kendrick wrote:
> On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
>
>> An application I had at work had a need for a cycle length of approx
>> 10^60, but unfortunately it also had to be multiplicative congruential
>> (it had to be possible to generate the nth number in the sequence
>> without generating the n1 numbers in between, and to the best of my
>> knowledge only MC RNGs have this property). That was a monster...
>
> How random did it have to be? If it doesn't have to be *that* random, a
> simple solution springs to mind: use a cryptographic hash over counter.
I had a play around with this idea in a quiet moment this morning as it
amused me to do so. I'm surprised at how well it works. My code is
available from http://www.rjek.com/seedrand.zip (thrown together in 10
minutes, may be hideously buggy.)
Generating 16MB of random data through it produces the following results
when fed to a program that analyses the randomness of data:
> Entropy = 7.999989 bits per byte.
>
> Optimum compression would reduce the size
> of this 16384000 byte file by 0 percent.
>
> Chi square distribution for 16384000 samples is 255.90, and randomly
> would exceed this value 50.00 percent of the times.
>
> Arithmetic mean value of data bytes is 127.5064 (127.5 = random).
> Monte Carlo value for Pi is 3.141744908 (error 0.00 percent).
> Serial correlation coefficient is 0.000128 (totally uncorrelated =
> 0.0).
To me, these results look excellent. Currently, it just uses MD5. This
perhaps isn't the fastest hash in the world, so the performance isn't
that great. (Took about 10 seconds to generate 16MB of random values on
a 2.8GHz Celeron).
This afternoon, I'll talk to my friendly professional cryptographer to
see if this kind of thing would be safe to use as a seekable stream
cipher, as that sounds like a superb use for it.
B.


0




Reply

nntp550 (4244)

10/18/2007 1:19:09 PM


On Oct 17, 11:31 pm, Rob Kendrick <n...@rjek.com> wrote:
> Time to extend BBC Basic again
Because of the increasing availability of 'true' 64bit processors I
have given consideration to a version of BBC BASIC with 64bit
integers and 80bit floats (it being the convention in BBC BASIC that
'promotion' from integer to float won't reduce the precision).
However compatibility with older versions would be an issue, and it's
never likely to come to fruition.
> and add something akin to C's long long? :)
Even in C you can't efficiently multiply two 32bit numbers to give a
64bit result. You first have to cast the 32bit numbers to 64bits,
which is likely to imply a runtime overhead unless the compiler
optimises it out. It's interesting that while a processor's native
multiply instruction is likely to be 32b*32b>64b (and its divide
instruction 64b/32b>32b) highlevel languages almost invariably
insist on the inputs and outputs being the same width.
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/18/2007 1:25:26 PM


Rob Kendrick wrote:
> Richard Russell wrote:
> > I've used
> > assembler code because it involves an integer multiplication with a
> > greaterthan32bit result, which is messy to do in BASIC.
> Time to extend BBC Basic again, and add something akin to C's long
> long? :)
Just how useful is this? I did implement a long integer for Basalt and
coded a multiplication, but never put it in a published version because
there seemed to be very little /actual/ demand for any of the other new
features, ie I have never had any feedback. ;)
I have noted Richard's comments on RND and could do something with that,
too.

; ,', * Basalt *  gives RO 3.10+ versions of BASIC V new and alternative
;,' keywords, dynamic memory for arrays and blocks, new variable types.
;', Legal, fast and simple to use. Freeware  version 0.98�  19 Aug 03
,; ',, Steve Drain, Kappa : http://www.kappa.me.uk/basalt.htm


0




Reply

steve3677 (307)

10/18/2007 3:42:06 PM


In message <1192713926.520421.260360@e34g2000pro.googlegroups.com>
Richard Russell <news@rtrussell.co.uk> wrote:
> It's interesting that while a processor's native
> multiply instruction is likely to be 32b*32b>64b (and its divide
> instruction 64b/32b>32b) highlevel languages almost invariably
> insist on the inputs and outputs being the same width.
This question probably exposes the chasm of my inexperience.
The use of integer arithmetic in programming seems to me to be
limited, in the main, to
1) representing addresses or offsets between addresses  hence
modulo 2 to the width of the address bus,
2) mathematical packages for number theory or algebra (e.g.
cryptography).
What other important uses, not catered for by floating point
arithmetic, have I omitted?

Gavin Wraith (gavin@wra1th.plus.com)
Home page: http://www.wra1th.plus.com/


0




Reply

gavin4770 (200)

10/18/2007 3:42:30 PM


In message <47165708$0$13932$fa0fcedb@news.zen.co.uk>
Rob Kendrick <nntp@rjek.com> wrote:
> On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
>
> > An application I had at work had a need for a cycle length of
> > approx 10^60, but unfortunately it also had to be multiplicative
> > congruential (it had to be possible to generate the nth number in
> > the sequence without generating the n1 numbers in between, and to
> > the best of my knowledge only MC RNGs have this property). That was
> > a monster...
>
> How random did it have to be? If it doesn't have to be *that*
> random, a simple solution springs to mind: use a cryptographic hash
> over counter.
It had to be as random as it could be while still maintaining the
nth number generation process.
Multiplicative congruential generators are generally quite good at
satisfying tests for randomness (good ones tend to only fail
dimensional clustering tests, and as my application only actually used
sequences of no more than 4 or 5, failing dimensional clustering
for dimensions > 14, which is where my solution fell down was
acceptable).

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/18/2007 4:44:17 PM


In message <4f335b74f7steve@revi11.plus.com>
"Ste (news)" <steve@revi11.plus.com> wrote:
> In article <47165708$0$13932$fa0fcedb@news.zen.co.uk>,
> Rob Kendrick <nntp@rjek.com> wrote:
> > On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
> >
> > > An application I had at work had a need for a cycle length of
> > > approx 10^60, but unfortunately it also had to be multiplicative
> > > congruential (it had to be possible to generate the nth number in
> > > the sequence without generating the n1 numbers in between, and
> > > to the best of my knowledge only MC RNGs have this property).
> > > That was a monster...
> >
> > How random did it have to be? If it doesn't have to be *that*
> > random, a simple solution springs to mind: use a cryptographic
> > hash over counter.
>
> Or use value n to seed a RNG then take the next number that pops out
> of that RNG, assuming that will be the same each time for a given n.
> Not quite as elegant as Rob's solution but if the RNG was good, I
> would expect it to work OK.
That might work, apart from the fact that 'n' could be anything up to
about 10^57.

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/18/2007 4:51:07 PM


In message <1192656881.659653.251570@i38g2000prf.googlegroups.com>
Richard Russell <news@rtrussell.co.uk> wrote:
> On Oct 16, 6:09 pm, Nick Roberts <tig...@orpheusinternet.co.uk> wrote:
> > The classic implementation of initializing each of the 623
> > subsequent words with 69069 times the previous one is simply
> > applying a fairly crude multiplicative congruential RNG to each
> > word.
>
> That method is known to be weak. See this page:
>
> http://www.math.sci.hiroshimau.ac.jp/~mmat/MT/MT2002/emt19937ar.html
>
> The BBC BASIC version I posted earlier in the thread uses an improved
> initialisation algorithm based on the code here:
>
> http://oku.edu.mieu.ac.jp/~okumura/cplusplus/mt19937.cc
Yep, I'm aware of that, but I did refer to it as "the classic
implementation".
I suspect that the best way to initialise it is to use CryptRandom for
each of the 624 words.

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/18/2007 4:52:47 PM


In message <47175d4d$0$13926$fa0fcedb@news.zen.co.uk>
Rob Kendrick <nntp@rjek.com> wrote:
> On Wed, 17 Oct 2007 18:40:08 +0000, Rob Kendrick wrote:
>
> > On Tue, 16 Oct 2007 18:09:52 +0100, Nick Roberts wrote:
> >
> > > An application I had at work had a need for a cycle length of
> > > approx 10^60, but unfortunately it also had to be multiplicative
> > > congruential (it had to be possible to generate the nth number in
> > > the sequence without generating the n1 numbers in between, and
> > > to the best of my knowledge only MC RNGs have this property).
> > > That was a monster...
> >
> > How random did it have to be? If it doesn't have to be *that*
> > random, a simple solution springs to mind: use a cryptographic hash
> > over counter.
>
> I had a play around with this idea in a quiet moment this morning as
> it amused me to do so. I'm surprised at how well it works. My code
> is available from http://www.rjek.com/seedrand.zip (thrown together
> in 10 minutes, may be hideously buggy.)
[SNIP]
My immediate response was "I'm not sure that works", but after thinking
about it for a while, I think it's actually rather a good solution.
It's an /irritating/ solution, 'cos it took a lot of hard work to get
the original generator to work, and hashing a count seems too simple,
but that's mostly a case of "I wish I'd thought of that" than a genuine
complaint 8)
There are one or two other criteria of the RNG that need to be
satisfied, but I don't think they would do anything other than require
reasonable care in the way it's used.

Nick Roberts tigger @ orpheusinternet.co.uk
Hanlon's Razor: Never attribute to malice that which
can be adequately explained by stupidity.


0




Reply

tigger2145 (262)

10/18/2007 5:05:31 PM


On Oct 18, 4:42 pm, Gavin Wraith <ga...@wra1th.plus.com> wrote:
> What other important uses, not catered for by floating point
> arithmetic, have I omitted?
Anything where absolute precision is required, i.e. when the
introduction of an error, however small, is unacceptable. One obvious
example is any kind of financial (currency) calculation; typically it
is vital that totals are exact: if the two sides of a balance sheet
differ by even a penny (or a cent) the results will be rejected.
Since 0.01 cannot be represented precisely, (binary) floating point
isn't suitable for currency calculations. Usually one would instead
use an integer number of a small unit such as pence or cents. Some
languages have a specific fixedpoint 'currency' data type to do this
for you.
Try this code in BBC BASIC. You'll soon see why floatingpoint isn't
suitable:
A = 0.00
REPEAT
A += 0.01
PRINT A
UNTIL FALSE
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/18/2007 5:14:30 PM


In message <1192727670.043415.127270@z24g2000prh.googlegroups.com>
Richard Russell <news@rtrussell.co.uk> wrote:
> On Oct 18, 4:42 pm, Gavin Wraith <ga...@wra1th.plus.com> wrote:
> > What other important uses, not catered for by floating point
> > arithmetic, have I omitted?
>
> Anything where absolute precision is required, i.e. when the
> introduction of an error, however small, is unacceptable. One obvious
> example is any kind of financial (currency) calculation; typically it
> is vital that totals are exact: if the two sides of a balance sheet
> differ by even a penny (or a cent) the results will be rejected.
Ah yes, money. Well that is definitely not part of my experience!
Are 64 bits sufficient for current accounting practice? Is there,
in fact, a standard which business software is supposed to keep to?
Do traders in different currencies have some abstract unit,
worth incredibly little, independent of any actual currency, for
the purposes of avoiding rounding errors in transactions, or do
they use rational arithmetic?
Thanks.

Gavin Wraith (gavin@wra1th.plus.com)
Home page: http://www.wra1th.plus.com/


0




Reply

gavin4770 (200)

10/18/2007 5:41:49 PM


On Thu, 18 Oct 2007 17:44:17 +0100, Nick Roberts wrote:
>> How random did it have to be? If it doesn't have to be *that* random,
>> a simple solution springs to mind: use a cryptographic hash over
>> counter.
>
> It had to be as random as it could be while still maintaining the nth
> number generation process.
>
> Multiplicative congruential generators are generally quite good at
> satisfying tests for randomness (good ones tend to only fail dimensional
> clustering tests, and as my application only actually used sequences of
> no more than 4 or 5, failing dimensional clustering for dimensions > 14,
> which is where my solution fell down was acceptable).
Having spoken to a cryptographer, my scheme would be even OK for
cryptographic purposes if the seed size was 128 bit and the counter was
always padded to the same length, so you'd just round that up to 128 bit
too. I suspect my suggestion would have been a simple solution for your
problem, although it may have not performed as well, as MD5 is quite
expensive.
B.


0




Reply

nntp550 (4244)

10/18/2007 5:48:21 PM


In message <47168d50$0$13926$fa0fcedb@news.zen.co.uk>
Rob Kendrick <nntp@rjek.com> wrote:
> On Wed, 17 Oct 2007 15:25:38 0700, Richard Russell wrote:
>
> > I've used
> > assembler code because it involves an integer multiplication with a
> > greaterthan32bit result, which is messy to do in BASIC.
>
> Time to extend BBC Basic again, and add something akin to C's long
> long? :)
I've been saying this for several years. PTR# and EXT# also need
to be 64 bit in preparation for supporting bigger files.
Dave


0




Reply

davehigton (2157)

10/18/2007 7:28:23 PM


On Thu, 18 Oct 2007 20:28:23 +0100, Dave Higton wrote:
> In message <47168d50$0$13926$fa0fcedb@news.zen.co.uk>
> Rob Kendrick <nntp@rjek.com> wrote:
>
>> On Wed, 17 Oct 2007 15:25:38 0700, Richard Russell wrote:
>>
>> > I've used
>> > assembler code because it involves an integer multiplication with a
>> > greaterthan32bit result, which is messy to do in BASIC.
>>
>> Time to extend BBC Basic again, and add something akin to C's long
>> long? :)
>
> I've been saying this for several years. PTR# and EXT# also need to be
> 64 bit in preparation for supporting bigger files.
Having an OS that supports them is the first step, of course. And one
could use such large files without support from BASIC, via SWIs.
But yes, it is something it needs. I find myself using 64 bit integers
in C code all the time these days.
B.


0




Reply

nntp550 (4244)

10/18/2007 8:34:20 PM


On Thu, 18 Oct 2007 13:19:09 +0000, Rob Kendrick wrote:
> My code is available from http://www.rjek.com/seedrand.zip
Gah, fingertrouble. That should be http://www.rjek.com/seekrand.zip not
seedrand.zip.
B.


0




Reply

nntp550 (4244)

10/19/2007 9:49:53 AM


In article <ant1815061cbvM+r@kappa.zetnet.co.uk>,
Steve Drain <steve@kappa.me.uk> wrote:
> Rob Kendrick wrote:
> > Richard Russell wrote:
> > > I've used
> > > assembler code because it involves an integer multiplication with a
> > > greaterthan32bit result, which is messy to do in BASIC.
> > Time to extend BBC Basic again, and add something akin to C's long
> > long? :)
>
> Just how useful is this? I did implement a long integer for Basalt and
> coded a multiplication, but never put it in a published version because
> there seemed to be very little /actual/ demand for any of the other new
> features, ie I have never had any feedback. ;)
I think the problem is that most stuff you access on RISC OS is <2GB in size
so 32 bits ints are fine (e.g. files and physical RAM). If, however, we
finally got support for big files (>4GB) then you'd absolutely need long
ints.
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/19/2007 1:05:15 PM


On Thu, 18 Oct 2007 18:05:31 +0100, Nick Roberts wrote:
> It's an /irritating/ solution, 'cos it took a lot of hard work to get
> the original generator to work, and hashing a count seems too simple,
> but that's mostly a case of "I wish I'd thought of that" than a genuine
> complaint 8)
There's always a simpler solution. And you're right, it's irritating
when you think of it after you've put the effort in. :)
B.


0




Reply

nntp550 (4244)

10/19/2007 4:32:57 PM


In article <6344cd334f.tigger@bc63.orpheusinternet.co.uk>,
Nick Roberts <tigger@orpheusinternet.co.uk> wrote:
> That might work, apart from the fact that 'n' could be anything up to
> about 10^57.
When I thought about it, I realised that mine is pretty much the same
suggestion as the one from Rob; put a number into an algorithm which
generates another number which should have as little statistical correlation
to the input as possible. The advantage of a hashing algorithm is that it
can take input from an arbitrarily large bitstream. A 190 bit value might be
a bit large for the average random number generator.
Steve

Steve Revill @ Home
Note: All opinions expressed herein are my own.


0




Reply

steve417 (852)

10/19/2007 8:04:28 PM


On 19 Oct 2007 "Ste (news)" <steve@revi11.plus.com> wrote:
> I think the problem is that most stuff you access on RISC OS is <2GB in size
> so 32 bits ints are fine (e.g. files and physical RAM). If, however, we
> finally got support for big files (>4GB) then you'd absolutely need long
> ints.
Its not absolutely essential. You can manage with an API that uses
high and low 32bit integers for file positions. BASIC's lack of
unsigned types does make this a lot more difficult though.
druck

The ARM Club Free Software  http://www.armclub.org.uk/free/
The 32bit Conversions Page  http://www.quantumsoft.co.uk/druck/


0




Reply

news5843 (7460)

10/19/2007 8:10:16 PM


On Oct 19, 9:10 pm, druck <n...@druck.freeuk.com> wrote:
> Its not absolutely essential. You can manage with an API that uses
> high and low 32bit integers for file positions. BASIC's lack of
> unsigned types does make this a lot more difficult though.
It's worth noting that an ordinary (40bit) float can contain a 32bit
unsigned integer *without any loss of precision*, which means you can
use a function like this to convert a 32bit integer variable to its
unsigned float equivalent:
DEF FNu(N%) = (N% >>> 1)*2.0 + (N% AND 1)
Similarly this function will convert an unsigned float value to its 32
bit integer equivalent:
DEF FNi(N) = ((N / 2) << 1)  (INT(N / 2) <> N / 2)
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.


0




Reply

news1075 (671)

10/19/2007 9:39:10 PM


On Fri, 19 Oct 2007 14:39:10 0700, Richard Russell wrote:
> On Oct 19, 9:10 pm, druck <n...@druck.freeuk.com> wrote:
>> Its not absolutely essential. You can manage with an API that uses high
>> and low 32bit integers for file positions. BASIC's lack of unsigned
>> types does make this a lot more difficult though.
>
> It's worth noting that an ordinary (40bit) float can contain a 32bit
> unsigned integer *without any loss of precision*
<pedant>Don't you mean accuracy?</pedant>
;)
B.


0




Reply

nntp550 (4244)

10/19/2007 10:32:25 PM


On 19 Oct 2007 Richard Russell <news@rtrussell.co.uk> wrote:
> On Oct 19, 9:10 pm, druck <n...@druck.freeuk.com> wrote:
>> Its not absolutely essential. You can manage with an API that uses
>> high and low 32bit integers for file positions. BASIC's lack of
>> unsigned types does make this a lot more difficult though.
> It's worth noting that an ordinary (40bit) float can contain a 32bit
> unsigned integer *without any loss of precision*, which means you can
> use a function like this to convert a 32bit integer variable to its
> unsigned float equivalent:
You'd be mad to rely on any kind of floating point conversions when
you need absolute integer precision, even if it works currently.
druck

The ARM Club Free Software  http://www.armclub.org.uk/free/
The 32bit Conversions Page  http://www.quantumsoft.co.uk/druck/


0




Reply

news5843 (7460)

10/19/2007 10:37:28 PM


In message <1192829950.339612.116580@q3g2000prf.googlegroups.com>
Richard Russell <news@rtrussell.co.uk> wrote:
> On Oct 19, 9:10 pm, druck <n...@druck.freeuk.com> wrote:
>> Its not absolutely essential. You can manage with an API that uses
>> high and low 32bit integers for file positions. BASIC's lack of
>> unsigned types does make this a lot more difficult though.
> It's worth noting that an ordinary (40bit) float can contain a 32bit
> unsigned integer *without any loss of precision*, which means you can
> use a function like this to convert a 32bit integer variable to its
> unsigned float equivalent:
> DEF FNu(N%) = (N% >>> 1)*2.0 + (N% AND 1)
> Similarly this function will convert an unsigned float value to its 32
> bit integer equivalent:
> DEF FNi(N) = ((N / 2) << 1)  (INT(N / 2) <> N / 2)
> Richard.
> http://www.rtrussell.co.uk/
> To reply by email change 'news' to my forename.
I think we have two slightly different problems.
1 When we need to access information about a file between 2GB and 4GB
in size, so we need an unsigned 32bit integer
2 When we need to access file information over 4GB, when we need more
than 32 bits. Using two integers to access the information then has
problems if the low integer is signed. The above may help with this,
but it gets complicated.
Would I be right in thinking that the BASIC OPEN functions would fail
on a file >2GB? Or is it just that EXT# and PTR# could not be used
with such files?

Alan Adams, from Northamptonshire
alan.adams@orchardway.freeserve.co.uk
http://www.nckc.org.uk/


0




Reply

alan.adams (504)

10/20/2007 11:08:20 AM


On Fri, 19 Oct 2007 23:37:28 +0100, druck wrote:
>> It's worth noting that an ordinary (40bit) float can contain a 32bit
>> unsigned integer *without any loss of precision*, which means you can
>> use a function like this to convert a 32bit integer variable to its
>> unsigned float equivalent:
>
> You'd be mad to rely on any kind of floating point conversions when you
> need absolute integer precision, even if it works currently.
IEE745 requires absolute accuracy for these whole values. BBC Basic
does its own floating point stuff rather than using the FPA11
instructions, so I don't know if it upholds to that requirement.
B.


0




Reply

nntp550 (4244)

10/20/2007 11:15:01 AM



58 Replies
348 Views
Similar Articles
[PageSpeed]
19

Similar Artilces:
BBC BASIC's RND FunctionHi all, I have been attempting to use BASIC's RND function to generate a
number between 0 and 14
in a weird attempt to use the stronghelp manual, I tried to use
Highest% = 14
tmp_int% = RND(Highest%)
but the manual says it generates a number between 1 and INT(n) (Highest%
in this case)
in VisualBASIC I can remember generating a number between any to any
(integer wise) using something like:
int_temp = RND(int_Lowest,int_Highest)
so int_Lowest could have been 50 ect
how would I do this in BBC BASIC as I cannot find any reference to this
kind of function
Cheers
In article <f... GWBASIC to BBC BASIC converterMy attention has been drawn to a GWBASIC to BBC BASIC converter here:
http://www.martinkd.freeuk.com/gw_bbc.html
but unfortunately the zip file is corrupt. Does anybody have a
complete version, or know the whereabouts of its author Martin
Carradus? I'm keen to port the program to Windows, where it would be a
very valuable utility in conjunction with BBC BASIC for Windows.
Can anybody help?
Richard.
http://www.rtrussell.co.uk/
To reply by email change 'news' to my forename.
In article <1139178640.927103.218240@g43g2000cwa.googlegroups.com>,
<news@rtrussell.co.... Calling functions from functions from functions ...Lets say I have a function g(p,x) where x and p are of some defined type.
I also have a function NewtonR which I can use like so:
x = NewtonR(g,p,x0)
There is also another function I want to call ImplicitTrap which can be
done as:
u = ImplicitTrap(g,p,u0,step,n)
This function defines a function of g, and it is this function that I'd
like to pass to NewtonR. Can it be done?
Basically the code is implementing the implicit trapezoidal rule for
numerical integration with the NR solver being used at each step with
automatic differentiation being used to handle the differentiation. M... Basic BASICNow that our series on Basic for Beginners  Basic BASIC by Ray Favre  is at
an end, those who have not read the series may wish to purchase the back
copies of Qercus that include the six parts of Basic BASIC.
The series takes a complete beginner to programming and introduces sufficient
to get you started and producing your own programs.
Examples are listed within the article or in the Yellow Pages feature in the
magazine and these can be typed in by the reader. These listings will also be
available on the Qercus website. Purchasers of the series, who don't have
access to the internet, ... When is a function not a function?I've got a collection of functions that accept a function or object
(paired with a method name) as a callback.
For the longest time I have relied on this test.
(typeof cb == 'function')
This should work as well, but I am not sure how well it degrades in
older browsers. I think there are issues with functions created in
another context (eg frame) as well.
(cb instanceof Function)
Then I came across this.
(!!fn && typeof fn != "string" && !fn.nodeName && fn.constructor !=
Array && /function/i.test( fn + "" ))
I'm sure it... Function functionalityHey,
I’m sure this is something that is relatively easy to code for, but I haven’t been able to do it easily without generating lots of different error messages! Basically, I created an Mfile, let’s say it’s called Batch_Run, and I want it’s operation to differ depending on what the user types in the command window. For example, currently, if the user types ‘Batch_Run’ in the command window, MatLab processes ALL the files in the current directory using the code in the Mfile. However, I would also like it so that if the use... function of a functionTried to solve numerically:
http://groups.google.com/group/sci.math/browse_frm/thread/248f76d024c1ac57/0bba983777a07bc9#0bba983777a07bc9
thus:
EQ= { f'[x] == f[f[x]], f[0]== 1} ; NDSolve[EQ,f,{x,0,2}];
But gives an error. NDSolve::ndnum: Differential equation does not
evaluate to a number at x = 0.
Also does not work even with other f[0] values. Any way to do that?
Hi,
it can't work because f[0]==1 give in your
differential equation
f'[0]==f[1] and NDSolve[] can't find the value for
f[1] until it
has integrated the equation.
The neted dependence... Function with a functionI have a GUI that calls a separate function (a different mfile) to
perform a certain task. Since this task takes several minutes to
complete, I would like to place some frames on the GUI to show
progress as the second function runs. These frames would change
colors upon getting to certain stages of the code. I am able to get
the frames to change color but they do so only after the second
function is finished running. Obviously this is no good. A sample of
my code is as follows:
set(findobj('Tag',['frame2']),'BackgroundColor','green');
This code is contained w... Functions of FunctionsHello,
I was wondering if anyone could help me with this.
I've gone through the book and help files as best I can, but
can't seem to figure out why the following doesn't work:
I'm trying to work with functions that take functions
as parameters and return other functions.
Below is an example...
(*clear stuff*)
Clear[a, b, c, x]
(*Define a functions a*)
\!\(a[x_] := \((Sin[x] + x\^3\/2)\)\)
(*define a function of functions*)
\!\(b[f_] = \((f'' + \(3\ f'\)\/2 + 5 f)\)\)
(*apply the functional function to a*)
c = b[... function of a function!!maybe i hasn't well formulated my question before, so my question is:
I have a function f = f(g) where g = g(a,b) is another function, i
need, in the function f to use a parameter of the function g (let's
say a), is there a way to call the parameter a inside the function
f??
thanks
In article <ef11409.1@webx.raydaftYaTP>, rafi <mimosi1@hotmail.com>
wrote:
> maybe i hasn't well formulated my question before, so my question is:
>
> I have a function f = f(g) where g = g(a,b) is another function, i
> need, in the function f to use a parameter of the func... function to functionHi friends ..
Is it possible to set the parameters in a function with a different function..?
If yes can you please a sample to erguzel2000@yahoo.com
... functions functionThe 'functions' function has changed in R14. Further it's help text
is misleading.
Why would this be a good idea? This was a very useful function. Is
there alternative efficient way of obtaining the parent file from a
function handle?
The help is misleading because it suggests that
f = functions(@deblank)
f =
function: 'deblank'
type: 'overloaded'
file: 'matlabroot\toolbox\matlab\strfun\deblank.m'
methods: [1x1 struct]
when what you really get is,
>> f = functions(@deblank)
f =... function functionsI am trying to make code for root finding and to do so I
must use "function functions". In order to be more familiar
with that, I tried to run one of the matlab examples like
the following:
function y = humps(x)
y = 1./((x.3).^2 + .01) + 1./((x.9).^2 + .04)  6;
x=0:0.002:1;
y=humps(x);
plot(x,y)
but I encounterd the follwing error:
??? Input argument "x" is undefined.
Error in ==> ffff at 2
y = 1./((x.3).^2 + .01) + 1./((x.9).^2 + .04)  6;
I appreciate you inform about the problem.
"Dariush Abdolah" <dabdolah@hotmail.com> wrote in message... Re: Why use Basic at all? (was Re: BASIC with builtin matrix function> Please read my message again. I referred to "'break' and
> 'continue'" (note AND not OR). Of course I am perfectly well aware
> that many BASICs have the equivalent functionality to 'break' (EXIT)
> but I don't know of any that have the equivalent functionality to
> 'continue', other than by using a GOTO.
The old Commodore 8bit BASICs had a CONT command which could be used
in direct mode to make program execution continue from whatever point
it had stopped  provided nothing had been done in the meantime (... Re: Why use Basic at all? (was Re: BASIC with builtin matrix function #2> "The 'continue' statement, like the 'break' statement, is a restricted
> form of the 'goto' statement. However, 'break' transfers control just
> *past* the end of a loop, while 'continue' transfers control to a
> point just *before* the end of the loop body. With 'break', control
> leaves the loop; with 'continue', control remains inside the loop."
> Here is how you would implement it in BASIC using a GOTO:
> FOR var = start TO finish
> REM First part of loop body h... CardLib.bbc a library for writing card games in BBC BASIC for WindowsIt is my pleasure to announce the release of CardLiba library for
writing card games in BBC BASIC for Windows.
CardLib comes with full documentation, six commented example programs
using different aspects of the library and one complete game. The
commented game source provides a good example of writing a card game for
Windows.
CardLib provides an interface to the Windows cards library which is used
by the card games which are supplied with WindowsTM. CardLib is
compatible with the 16bit and 32bit versions of Cards.dll and
Cards32.dll.[1]
CardLib can be found at:
htt... Re: Why use Basic at all? (was Re: BASIC with builtin matrix function #3> >> I know PDS 6.0 had DO LOOP.
> >
> > What date would that have been?
> I believe it was early 1988.
> Tom Lake
Waterloo Structured BASIC, which was an addon for the Commodore PET
and was produced in about 1981, had WHILE...WEND and LOOP...ENDLOOP
structures. It interfaced with a MS BASIC, but was actually written by
people at the University of Waterloo, Canada.
dow
... Parameterizing Functions Called by Function FunctionsI would like to know whether this "Parameterizing Functions Called by
Function Functions" is available in release 14 only. I have Matlab6p5
release 13, but none of the examples found in the following website
work on my machine.
<http://www.mathworks.com/access/helpdesk/help/techdoc/math/funfun17.html#941087>
Thanks.
In article <ef1dd9d.1@webx.raydaftYaTP>,
"Beiyan Ou" <beiyanou@uvic.ca> wrote:
> I would like to know whether this "Parameterizing Functions Called by
> Function Functions" is available in release 14 only. I have Matlab6p... very basic question on function<?php
function h()
{
echo 'hello';
}
?>
BIG
<? h(); ?>
Result with PHP4.3.10/Apache1.3.33 => BIGBIGhello
Result with PHP5.2.6/Apache2.2.3 => BIG
with PHP 5.2.6
hello is not displayed
why?
how can I fix this?
Thank you
On Jun 26, 2:07 pm, Personne <cpdiv...@gmail.com> wrote:
> <?php
> function h()
> {
> echo 'hello';}
>
> ?>
> BIG
> <? h(); ?>
>
> Result with PHP4.3.10/Apache1.3.33 => BIGBIGhello
> Result with PHP5.2.6/Apache2.2.3 => BIG
>
> with PHP 5.2.6
> hello is not displayed
> why?... Basic functions missingHi all,
First post here, so please point me to TFM if there's something I need
to R :)
I just did a binary install on Solaris x86 (/usr/local). Everything
went pretty smoothly until I started customizing my .emacs file:
(load "/usr/local/lib/xemacs20.2/lisp/prim/simple.el")
(autoload 'cperlmode "/usr/local/lib/xemacs20.2/lisp/modes/cperl
mode.el")
;(setbackgroundcolor "white")
;(setforegroundcolor "black")
;(setdefaultfont "b&hlucidamediuminormalsans121207575p71
iso88591")
(linenumbermode 1)
(columnn... basic function questionHi
I have a selection of functions each in their own M file in the work
folder of matlab. I then have a main program that needs to run these
other functions with data that it generates.
Im trying to use the 'feval' function to do this but dont know how to
make the functions in the work folder accessible, as just now it just
tells me that they are undefined.
thanks
nick wrote:
>
>
> Hi
>
Hello!
I don't know if this is really your problem, but you should have the
functions you need, the ".m" files in the same work folder and the
name of your function should... BBC BASIC EnvelopeAm trying to get a BBC B BASIC program to work on a RiscPC.
Using 'Drucks' ENVELOPE2 SOUND emulation  I am not getting the sound
to work  ie no sound output.
Does the BBC B machine have a standard 'ENVELOPE' at startup?
Thanks

Colin Ferris Cornwall UK
cferris@freeremoveuk.com.invalid wrote:
: Does the BBC B machine have a standard 'ENVELOPE' at startup?
I don't believe so. I think you always have to have an
ENVELOPE statement before you use SOUND with a positive
second parameter (amplitude/envelope). That's certainly
true of 'BBC BASIC for W... BBC BASIC in a webpage.Dear All,
I am curious to know if it's possible to run a BBC BASIC program in a
web page.
I suspect it isn't, in which case I still thought it worth putting the
idea out to see if it captures anyones interest.
I am aware that one can embed a BBC Micro (Running BBC BASIC II) in a
web page which I featured in issue two of RISCOScode...
http://www.RISCOScode.com/is002/Yellow.html
.... but this has to be used, (correct me if I'm wrong !), like a BBC
Micro. I also think it uses Java Script which I think stops it working
with some browsers. (Again, correct me if I'm wrong).
I ... Very very basic function questionHi I am trying to learn and write a function that outputs and plots an euler approximation to logistic growth equation, f(t, y) = y*(1y) for different time steps. I want it to be as general as possible so I want the user to be able to input an argument, m, and the function will output a plot for 10^1, 10^2, 10^3, ..., 10^m, time steps. Here is what I have so far (besides the plot portion) and it keeps failing:
function [ t, y ] = eulerstep(t_0, y_0, t_end, m)
%different method for different steps
t = zeros(m, 10.^m);
y = zeros(m, 10.^m);
t(1, 1) = t_0;
y(1, 1) = y_0;
for k = 2:m
[t(k... Compiler for BASIC BBCHi,
is there a good compiler for BBC BASIC (Archimedes) around?
A.

British groggy A7000+ running RISC OS 4.39 Adjust
Portrait & email: http://home.chiemgaunet.de/ausserstorfer/
On Sat, 16 Feb 2008 17:21:16 +0100, Alex' A. Interrants wrote:
> Hi,
>
> is there a good compiler for BBC BASIC (Archimedes) around?
No. But there is ABC, which I believe Castle will now sell you.
B.
In message <CzGtj.1925$d62.845@newsfe6gui.ntli.net>
Rob Kendrick <nntp@rjek.com> wrote:
> On Sat, 16 Feb 2008 17:21:16 +0100, Alex' A. Interrants wrote:
>&g...



