配列をシャッフルする


仕事では専らPHPだが、プライベートでは段々、C, C++に戻りつつある今日のこの頃。

PHP

<?php
function my_shuffle(&$arr){
    srand((double) microtime() * 10000000);
    $n = count($arr);
    for($i=0;$i<$n;$i++){
        $rnd = rand(0, $n - 1);
        $temp      = $arr[$rnd];
        $arr[$rnd] = $arr[$i];
        $arr[$i]   = $temp;
    }
}
?>

C

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define COUNT(arr) (sizeof(arr)/sizeof(arr[0]))

void shuffle(int arr[], int n);

void shuffle(int arr[], int n){

  int i, rnd, temp;

  srand(time(NULL));

  for(i=0;i<n;i++){
    rnd = rand() % n;
    temp = arr[i];
    arr[i] = arr[rnd];
    arr[rnd] = temp;
  }
}

int main(int argc, char *argv[]){

  int i, n;
  int nums[] = {1, 2, 3, 4, 5};
  n = COUNT(nums);
  shuffle(nums, n);

  for(i=0;i<n;i++){
    printf("%d ", nums[i]);
  }
  printf("\n");

  return 0;
}

C++

template<typename T>
void shuffle(T arr[], int n){

  int i, rnd;
  T temp;

  srand(time(NULL));

  for(i=0;i<n;i++){
    rnd = rand() % n;
    temp = arr[i];
    arr[i] = arr[rnd];
    arr[rnd] = temp;
  }
}


追記

PHPにはshuffle、C++にはrandom_shuffleという関数がありましたorz