> > the latest xkcd on my internet is about a programming language that
> > attempts to eliminate off-by-one errors via "every time an integer is
> > stored or read, its value is adjusted up or down by a random amount
> > between 40 and 50". The title text clarifies that this generates
> > off-by-40-or-50 errors instead.

> I'm looking a little into engaging cpython with a goal of implementing 
> something like this.

> It's maybe not the best choice

> so to generate a number between 40 and 50 i suppose i'd call a _PyOS_URandom 
> function and read 1 byte. i could keep a bit cache if i were fancy, but would 
> likely make more sense to spend time on ensuring integer stores and loads are 
> properly effected.

ok now we have the irritating concern that 40-50 is a range that is not an 
integer ration of any convenient number of bits. to do 40-50 inclusive that's a 
size of 11. so i guess i'd discard bytes that are outside some range ummm 
256%11 == 3 so uhh so i guess i'd discard 253, 254, and 255. (253%11 == 0 which 
aliases 0%11 == 0).

drafting function:
#include <pycore_pylifecycle.h>
int adjust(type * val) {
  unsigned uint8_t adj;
  int status;
  do {
    status = _PyOS_URandom(&adj, 1);
    if (status) { return status; }
  } while (adj >= 253);
  val 

ooops i need an extra bit of information to decide the sign!
ok ummmmm that's 12 bits? no ... i have 11 values, and a sign, so that's 22 
total values. i think? +40, -40, +50, -50; 11 on each side. there's no zero so 
there's no signless or shared value counted on both sides of the sign. 22 total 
values. i think! i can always fix it if i'm wrong and actually reach an 
implementation.

256%22 == 14; 242%22 == 0
so discard values >= 242

copypaste, fix constants, continue:

#include <pycore_pylifecycle.h>
int adjust(type * val) {
  unsigned uint8_t adj;
  int status;
  do {
    status = _PyOS_URandom(&adj, 1);
    if (status) { return status; }
  } while (adj >= 242);
  adj 

ok ummm now i have negative values to contend with ... maybe it would be more 
conven-- ... but maybe it's clearer for me for now to keep this value unsigned

#include <pycore_pylifecycle.h>
int adjust(type * val) {
  unsigned uint8_t rnd;
  int status, adj;
  do {
    status = _PyOS_URandom(&rnd, 1);
    if (status) { return status; }
  } while (rnd >= 242);
  adj = int(rnd % 22) - 11

hrm [--

Reply via email to