## random number generation

26 posts / 0 new
Author
Message

i need to have a random number between 0 and 7 generated. i am using an attiny2313. can any one give me a little snippet of code.

mmmlinux wrote:
i need to have a random number between 0 and 7 generated. i am using an attiny2313. can any one give me a little snippet of code.

From the C FAQ:

Quote:
13.16: How can I get random integers in a certain range?

A: The obvious way,

rand() % N /* POOR */

(which tries to return numbers from 0 to N-1) is poor, because
the low-order bits of many random number generators are
distressingly *non*-random. (See question 13.18.) A better
method is something like

(int)((double)rand() / ((double)RAND_MAX + 1) * N)

If you're worried about using floating point, you could use

rand() / (RAND_MAX / N + 1)

Both methods obviously require knowing RAND_MAX (which ANSI
#defines in ), and assume that N is much less than
RAND_MAX.

(Note, by the way, that RAND_MAX is a *constant* telling you
what the fixed range of the C library rand() function is. You
cannot set RAND_MAX to some other value, and there is no way of
requesting that rand() return numbers in some other range.)

If you're starting with a random number generator which returns
floating-point values between 0 and 1, all you have to do to get
integers from 0 to N-1 is multiply the output of that generator
by N.

References: K&R2 Sec. 7.8.7 p. 168; PCS Sec. 11 p. 172.

--
brunk

this is a good fast integer generator
http://en.wikipedia.org/wiki/Lin...

I use this specific line for integers from 0 to 250
rand=(rand*109+89)%251;

init rand with some value. I start with 89. I think even 0 works. requires 16bit operations. might work with %256 too for 0-255 range. I just use primes.
short sequence of 40 numbers seems to have nice even distribution

Kunne ogsÃ¥ bare gÃ¸res sÃ¥dan

Dim I As Word ' dim variable

Do
I = Rnd(40) 'get random number (0-39)
Print I 'print the value
Wait 1 'wait 1 second
Loop

It would be nice to post in English language.

BTW, Bing translates it as
"Could also just be such"

/Martin.

oh.. all people not speak norwegian!

Thierry Pottier

If you want a non-deterministic random generator (i.e. one not based on mathematical algorithms), just do some ADC samples of an open port line and use the low bit of consecutive samples to construct your random number.

-- Thilo

Einstein was right: "Two things are unlimited: the universe and the human stupidity. But i'm not quite sure about the former..."

I also don't speak norwegian but can still understand good enough to translate "can also be made like this".

Some algorithms are better than others, but depending on what you are planning to do with the random number, we cannot know what is overkill and what is stupid way.

For normal dice games etc it is good enough to do something like this (pseudocode):

```  repeat
random=random+1;
if random==8 then random=0;
until key_pressed;
```

That's danish, not norwegian.

A number from 0 to 7?
How random can 3 bits be?

There has been a pretty recent post about using the lower bit(s) of the ADC as input for a random number and a few years ago a guy wrote a nice article with several different sources for random bits in AVR processors. The ADC was one of the sources, phase noise between the avr main chrystal and a 32kHz watch chrystal was another. The article (in the pojects section?) also had (has) code examples and some analysis of the randomness of those different sources. Good read and highly recomended for danisch, norwegian and other people.

Doing magic with a USD 7 Logic Analyser: https://www.avrfreaks.net/comment/2421756#comment-2421756

Bunch of old projects with AVR's: http://www.hoevendesign.com

Paulvdh wrote:
A number from 0 to 7?
How random can 3 bits be?

That's a very good question. Here's a sequence of 20 independent random numbers from 0 to 7
`3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3`

No, I'm not kidding, it really is. It's just that 3 have a 99.99% probability to be drawn and thus a very low probability for the other numbers to share.
Here's another sequence from 0 to 7 generated with a completely different method

`3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3`

In this case I have a start number choosen with equal probability and next number be the same as the previous with 99.99% probability and with 0.01% probability be a new one choosen uniformly from 0 to 7.

These two methods will give completely different sequences in the long run, with completely different statistical properties. But they're both random sequences of 3 bit random numbers.

So how random can 3 bits be? Well they can be random in very many ways. Usually one want something more than just "random".

@sniggelen:

You're complely wrong of course, it's not "3" but it's "4".

```int getRandomNumber()
{
return 4;  // Chosen by fair dice roll.
// Guaranteed to be random.
}```

Reference:
http://xkcd.com/221/

Anyway, I always did suck at statistics at school.

Quote:
Usually one want something more than just "random".
A very good example of that is the shuffle function of a cd player. I once had a cd player with a true "random" button and it was pretty annoying when it played the same song 2 or 3 times in a row.

Doing magic with a USD 7 Logic Analyser: https://www.avrfreaks.net/comment/2421756#comment-2421756

Bunch of old projects with AVR's: http://www.hoevendesign.com

There are a variety of well-studied techniques for this. Google "pseudorandom number generation" or "pseudorandom number generator".

I believe that modern Intel chips have an instruction or somesuch that actually produces true random numbers (it uses two interfering oscillators plugged into a voltage meter, or something) but I do not know whether any programming libraries actually tap into this.

Last Edited: Thu. Jan 10, 2013 - 06:35 AM

Quote:

I believe that modern Intel chips have an instruction or somesuch that actually produces true random numbers (it uses two interfering oscillators plugged into a voltage meter, or something) but I do not know whether any programming libraries actually tap into this.

What relevance would that have to an avr-gcc programmer anyway?

In the meantime the Tutorial forum here has at least two good articles about random numbers on AVRs.

One I tried in my younger days was to read the program's code byte by byte. It was terrible.

If you don't know my whole story, keep your mouth shut.

If you know my whole story, you're an accomplice. Keep your mouth shut.

Quote:

It was terrible.

Not only not random but presumably totally deterministic. At least if you have a number of variables in SRAM I suppose there'd be a chance if you pointed to the area (maybe the SFRs too?) then hashed/CRCd the whole lot you mioght get something a bit random?

Thanks worked a treat. I know it's not purely random, but it's varied enough to suit my needs.

Australian Entrepreneur, using the AVR technology for prototyping and market testing.

http://brisrocket.wordpress.com

TPE wrote:
oh.. all people not speak norwegian!

What a surprise.

If you don't know my whole story, keep your mouth shut.

If you know my whole story, you're an accomplice. Keep your mouth shut.

Hi people!
This is what I use. May have some bugs but worked for me (atTiny2313).

```void initRand(void)
{
uint8_t state;
static uint8_t EEMEM sstate;

// Check if it's unwritten EEPROM (first time). Use something funny
// in that case.
if (state == 0xff)
state = 0xAA;
srand(state);
eeprom_write_byte(&sstate, rand());
}

int main(void){

initRand();

#define SLEEPTIME 5
#define MAX_DICE 5
while(1){

for(uint8_t i=0;i<=20;i++){
showSequence(SLEEPTIME);
sleep(SLEEPTIME);
}

//show result
uint8_t dice = rand() / (RAND_MAX / MAX_DICE + 1);
while(1){
showDice(dice+1);
}
}
```

Hope it is ok to bump an old thread, but this show up on google.
The code is from my lame dice game, to test charlieplexing. Shameless plug:
https://raw.github.com/marcolinu...

EDIT: code tags. Thanks for the hint js!

Last Edited: Thu. Mar 20, 2014 - 04:13 AM

Shameless hint here https://www.avrfreaks.net/index.p... :wink:

John Samperi

Ampertronics Pty. Ltd.

https://www.ampertronics.com.au

* Electronic Design * Custom Products * Contract Assembly

Here is one I did that uses entropy on floating input pin (PD6 in this case) in combination with the linear generator from widipedia:

#define RANDOM_PORT PORTD
#define RANDOM_PIN PIND
#define RANDOM_DDR DDRD
#define RANDOM_BIT PD6

uint16_t _fx_rand()
{
static uint16_t lfsr = 0xACE1u;
static uint16_t bit;
bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
return lfsr =  (lfsr >> 1) | (bit << 15);
}

void fx_random(char *buf, uint16_t size){
// set pin as input
RANDOM_DDR &= ~_BV(RANDOM_BIT);
RANDOM_PORT &= ~_BV(RANDOM_BIT);

while(size){
size--;
buf[size] = 0;
for(int c = 0; c < 8 * sizeof(char); c++){
uint16_t timeout = 0xff;
uint16_t x = 1;
uint8_t d = RANDOM_PIN & _BV(RANDOM_BIT);
while((d == (RANDOM_PIN & _BV(RANDOM_BIT))) && (timeout--)){
x = _fx_rand();
}
buf[size] |= ((x & 1) << c);
}
}
}

LibK - device driver support for flash based microcontrollers: GitHub project

http://oskit.se - join me on my quest to become a better programmer

Oh.. forgot to mention..

Usage:

random int:

int random = 0; fx_random((char*)&random, sizeof(int));

random buffer:

char buf[20]; fx_random(buf, sizeof(buf));

LibK - device driver support for flash based microcontrollers: GitHub project

http://oskit.se - join me on my quest to become a better programmer

Last Edited: Tue. Oct 28, 2014 - 05:09 PM

if you want to try simple manual RNG, you can go to this link

http://zaky.ga/avr-manual-rng/

zaky.ga

Where were you 5 years ago?

JIm

I would rather attempt something great and fail, than attempt nothing and succeed - Fortune Cookie

"The critical shortage here is not stuff, but time." - Johan Ekdahl

"Step N is required before you can do step N+1!" - ka7ehk

"If you want a career with a known path - become an undertaker. Dead people don't sue!" - Kartman

"Why is there a "Highway to Hell" and only a "Stairway to Heaven"? A prediction of the expected traffic load?"  - Lee "theusch"

Speak sweetly. It makes your words easier to digest when at a later date you have to eat them ;-)  - Source Unknown

Atmel Studio6.2/AS7, DipTrace, Quartus, MPLAB, RSLogix user

Where were you 5 years ago?

Since the time for a reply can be somewhat random, 5 years is not out of the question.

When in the dark remember-the future looks brighter than ever.   I look forward to being able to predict the future!