Making a radios form element required
Looking at the code used from Drupal core, I found that book.admin.inc uses the following code, to define a require radios element.

$types = node_type_get_names();

$form['book_child_type'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('Content type for child pages'),
  '#default_value' =&gt; variable_get('book_child_type', 'book'),
  '#options' =&gt; $types,
  '#required' =&gt; TRUE,
);


The code you shown doesn't work because #default_value is set to NULL.

'#default_value' =&gt; isset($which_option) ? $which_option : NULL,


You don't show how $which_option is initialized; either that variable is never initialized, or it is not initialized when you tested the code. In both the cases, isset($which_option) returns FALSE and #default_value is set to NULL.

Instead of that, the code should avoid setting #default_value, which is what form_test.module (a module for testing form elements) does. (See the first form element in the following code; the other form elements are shown to make a comparison.)

$form['radios'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; 'Radios',
  '#options' =&gt; $options,
  '#required' =&gt; TRUE,
);
$form['radios_optional'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; 'Radios (optional)',
  '#options' =&gt; $options,
);
$form['radios_optional_default_value_false'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; 'Radios (optional, with a default value of FALSE)',
  '#options' =&gt; $options,
  '#default_value' =&gt; FALSE,
);


Notice the first radios element, which is required, doesn't have any #default_value property set.