Don’t worry about remembering the word for it, it took me several minutes to remember it.
(Dammit Jim, I’m a programmer, not a mathematician!)
The important thing is the idea of a 1-to-1 mapping of possible values.
Not exactly. Combining the two numbers is a different matter to the jectiveness (that’s not a real word) of the function.
A hash function is bijective if every unique input maps to a unique output.
If two inputs result in the same output then the function is not bijective.
(If a bijective function is used as the transform/step function of a PRNG then that PRNG would have a full period. Don’t worry if this doesn’t make sense, this is creeping into the realms of abstract maths.)
I understood how you meant it.
But yes, in most circumstances it would seem sarcastic.
Especially on the internet, where it’s hard to convey the ‘tone’/‘intent’.
(It’s kind of hard to explain why it sounds that way though.)
Instead of trying to explain why I’ll say that something like “thank you for explaining this” or “thank you, I didn’t know that” or “thanks for the info” sound better.
(Also, ungenuine or disingenuous.)
Ah, tu est un Canadien français?
Ah, sorry, I assumed you already knew about bitwise operations and bitmasks.
If not, the wikipedia article is quite good. (
^ in C++.)
Even if you don’t use procedural generation, you can use your new bitmasking powers to fit two tiles per byte if you only have 16 tiles.
Procedural generation can be difficult to do well.
random isn’t from Arduboy2, it’s from avr-libc, which is the library that the Arduino library is built on top of.
The documentation is here.
The actual implementation (for avr-libc 2.0.0) is:
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* Posix rand_r function added May 1999 by Wes Peters <firstname.lastname@example.org>.
* $Id: random.c 1944 2009-04-01 23:12:20Z arcanum $
static char sccsid = "@(#)rand.c 8.1 (Berkeley) 6/14/93";
do_random(unsigned long *ctx)
* Compute x = (7^5 * x) mod (2^31 - 1)
* wihout overflowing 31 bits:
* (2^31 - 1) = 127773 * (7^5) + 2836
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
long hi, lo, x;
x = *ctx;
/* Can't be initialized with 0, so use another value. */
if (x == 0)
x = 123459876L;
hi = x / 127773L;
lo = x % 127773L;
x = 16807L * lo - 2836L * hi;
if (x < 0)
x += 0x7fffffffL;
return ((*ctx = x) % ((unsigned long)RANDOM_MAX + 1));
random_r(unsigned long *ctx)
static unsigned long next = 1;
srandom(unsigned long seed)
next = seed;
But, I would advise against using the default implementation because it might change.
You’re better off writing a different function, because you know that won’t change.
Also, using a different function will make porting to other systems easier (if you want to port it at any point).
By the way, do you know exactly what kind of game you want to make?
Do you want to do a Zelda-like game, or more of a roguelike?
Would there be a story?
If you want to do something Zelda-like, you’re probably better off crafting the world by hand.
If you want to do a hash-&-slash/roguelike then I think you should make the overworld by hand and just procedurally generate the dungeons.
But again, it depends what kind of game you want to make.
(E.g. Should there be a story? Does it make sense to have the same overworld on every game? etc.)