src/test/SDL_test_random.c
author Ryan C. Gordon <icculus@icculus.org>
Sun, 21 Oct 2018 22:40:17 -0400
changeset 12345 50e1cca28b39
parent 11811 5d94cb6b24d3
child 12503 806492103856
permissions -rw-r--r--
wasapi/win32: Sort initial device lists by device GUID.

This makes an unchanged set of hardware always report devices in the same
order on each run.
aschiffler@6699
     1
/*
aschiffler@6699
     2
  Simple DirectMedia Layer
slouken@11811
     3
  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
aschiffler@6699
     4
aschiffler@6699
     5
  This software is provided 'as-is', without any express or implied
aschiffler@6699
     6
  warranty.  In no event will the authors be held liable for any damages
aschiffler@6699
     7
  arising from the use of this software.
aschiffler@6699
     8
aschiffler@6699
     9
  Permission is granted to anyone to use this software for any purpose,
aschiffler@6699
    10
  including commercial applications, and to alter it and redistribute it
aschiffler@6699
    11
  freely, subject to the following restrictions:
aschiffler@6699
    12
aschiffler@6699
    13
  1. The origin of this software must not be misrepresented; you must not
aschiffler@6699
    14
     claim that you wrote the original software. If you use this software
aschiffler@6699
    15
     in a product, an acknowledgment in the product documentation would be
aschiffler@6699
    16
     appreciated but is not required.
aschiffler@6699
    17
  2. Altered source versions must be plainly marked as such, and must not be
aschiffler@6699
    18
     misrepresented as being the original software.
aschiffler@6699
    19
  3. This notice may not be removed or altered from any source distribution.
aschiffler@6699
    20
*/
aschiffler@6699
    21
aschiffler@6699
    22
/*
aschiffler@6699
    23
aschiffler@6699
    24
 A portable "32-bit Multiply with carry" random number generator.
aschiffler@6699
    25
slouken@7191
    26
 Used by the fuzzer component.
aschiffler@6699
    27
 Original source code contributed by A. Schiffler for GSOC project.
aschiffler@6699
    28
aschiffler@6699
    29
*/
aschiffler@6699
    30
aschiffler@6699
    31
#include "SDL_config.h"
aschiffler@6699
    32
slouken@7191
    33
#include <stdlib.h>
aschiffler@6718
    34
#include <stdio.h>
aschiffler@6699
    35
#include <time.h>
aschiffler@6699
    36
aschiffler@6699
    37
#include "SDL_test.h"
aschiffler@6699
    38
aschiffler@6699
    39
/* Initialize random number generator with two integer variables */
aschiffler@6699
    40
aschiffler@6699
    41
void SDLTest_RandomInit(SDLTest_RandomContext * rndContext, unsigned int xi, unsigned int ci)
aschiffler@6699
    42
{
aschiffler@6699
    43
  if (rndContext==NULL) return;
slouken@7191
    44
aschiffler@6699
    45
  /*
aschiffler@6699
    46
   * Choose a value for 'a' from this list
aschiffler@6699
    47
   * 1791398085 1929682203 1683268614 1965537969 1675393560
aschiffler@6699
    48
   * 1967773755 1517746329 1447497129 1655692410 1606218150
aschiffler@6699
    49
   * 2051013963 1075433238 1557985959 1781943330 1893513180
slouken@7191
    50
   * 1631296680 2131995753 2083801278 1873196400 1554115554
aschiffler@6699
    51
   */
aschiffler@6699
    52
  rndContext->a = 1655692410;
aschiffler@6699
    53
  rndContext->x = 30903;
aschiffler@6699
    54
  rndContext->c = 0;
aschiffler@6699
    55
  if (xi != 0) {
aschiffler@6699
    56
      rndContext->x = xi;
aschiffler@6699
    57
  }
aschiffler@6699
    58
  rndContext->c = ci;
aschiffler@6699
    59
  rndContext->ah = rndContext->a >> 16;
aschiffler@6699
    60
  rndContext->al = rndContext->a & 65535;
aschiffler@6699
    61
}
aschiffler@6699
    62
aschiffler@6699
    63
/* Initialize random number generator from system time */
aschiffler@6699
    64
aschiffler@6699
    65
void SDLTest_RandomInitTime(SDLTest_RandomContext * rndContext)
aschiffler@6699
    66
{
aschiffler@6699
    67
  int a, b;
slouken@7191
    68
aschiffler@6699
    69
  if (rndContext==NULL) return;
slouken@7191
    70
aschiffler@6699
    71
  srand((unsigned int)time(NULL));
aschiffler@6699
    72
  a=rand();
slouken@11752
    73
  srand((unsigned int)clock());
aschiffler@6699
    74
  b=rand();
aschiffler@6699
    75
  SDLTest_RandomInit(rndContext, a, b);
aschiffler@6699
    76
}
aschiffler@6699
    77
aschiffler@6699
    78
/* Returns random numbers */
aschiffler@6699
    79
aschiffler@6699
    80
unsigned int SDLTest_Random(SDLTest_RandomContext * rndContext)
aschiffler@6699
    81
{
aschiffler@6699
    82
  unsigned int xh, xl;
aschiffler@6699
    83
aschiffler@6699
    84
  if (rndContext==NULL) return -1;
slouken@7191
    85
aschiffler@6699
    86
  xh = rndContext->x >> 16, xl = rndContext->x & 65535;
aschiffler@6699
    87
  rndContext->x = rndContext->x * rndContext->a + rndContext->c;
aschiffler@6699
    88
  rndContext->c =
aschiffler@6699
    89
    xh * rndContext->ah + ((xh * rndContext->al) >> 16) +
aschiffler@6699
    90
    ((xl * rndContext->ah) >> 16);
aschiffler@6699
    91
  if (xl * rndContext->al >= (~rndContext->c + 1))
aschiffler@6699
    92
    rndContext->c++;
aschiffler@6699
    93
  return (rndContext->x);
aschiffler@6699
    94
}
slouken@11465
    95
slouken@11465
    96
/* vi: set ts=4 sw=4 expandtab: */